精通init ramfs構建

一、init ramfs是什么  

在2.6版本的linux內核中,都包含一個壓縮過的cpio格式的打包文件。當內核啟動時,會 從這個打包文件中導出文件到內核的rootfs文件系統,然后內核檢查rootfs中是否包含有init文件,如果有則執行它,作為PID為1的第一個進 程。這個init進程負責啟動系統后續的工作,包括定位、掛載“真正的”根文件系統設備(如果有的話)。如果內核沒有在rootfs中找到init文件,則內核會按以前版本的方式定位、掛載根分區,然后執行/sbin/init程序完成系統的后續初始化工作。

   這個壓縮過的cpio格式的打包文件就是init ramfs。編譯2.6版本的linux內核時,編譯系統總會創建init ramfs,然后把它與編譯好的內核連接在一起。內核源代碼樹中的usr目錄就是專門用于構建內核中的init ramfs的,其中的ini tramfs_data.cpio.gz文件就是init ramfs。缺省情況下,init ramfs是空的,X86架構下的文件大小是134個字節。

  二、構建第一個init ramfs:hello world

  從C語言開始,學習計算機編程語言的第一個程序幾乎都是hello world,因此我們也構建一個最簡單的hello world式的init ramfs,以說明init ramfs的基本構建方法。

  init ramfs的靈魂是init文件(或者叫程序,因為它會被內核第一個執行),我們先寫一個簡單的init程序,它會在內核的console中打印出經典的hello world信息。

  hello.c:

  #include

  #include

  int main(int argc,char argv[])

  {

  printf("hello world, from init ramfs.n");

  sleep(9999999);

  return 0;

  }

  其中的sleep()函數語句是為了避免執行時內核很快打出panic的信息,并非功能上的需要。

  接著把hello.c編譯成靜態連接程序:

  gcc -o hello_static -static -s hello.c

  命令行中的-s參數表示編譯后的程序不包含調試定位信息,目的是減少編譯出來的程序文件的大小。

  再創建一個init ramfs的構建源文件目錄image,把hello_static程序拷入這個目錄,并改名為init。

  在image目錄下,創建一個dev/console的設備文件,否init程序無法在內核console中輸出信息:

  mknod -m 600 dev/console c 5 1

  注意,執行這個命令需要有root權限。

  好了,現在可以設置內核配置參數,進行init ramfs的構建了:

   在general setup配置目錄下的init ramfs sources配置項下輸入image的路徑名,比如我的路徑就是/home/wyk/init ramfs-test/image。因為我們的init程序是ELF格式的,所以內核需要支持ELF的可執行文件,否則啟動這個init程序會失敗。在內 核的 Executable file formats配置目錄下,選擇 kernel support for ELF binaries,則可使內核支持ELF格式的可執行文件。其他內核配置參數根據實際需要設置即可,不過,為了減少內核編譯時間,可參考這篇文章 http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type- blog-itemid-293122.html設置一個最簡單的內核配置。

  內核配置參數設置完成后,按常規的內核編譯方法進行編譯,init ramfs就自動連接到編譯好的內核映像文件中了。

  三、試驗環境搭建

   試驗init ramfs需要經常重啟系統,所以使用CPU模擬器是不錯的選擇。我們可以選用qemu,它支持直接啟動linux內核,無需在模擬器中安裝OS。從方便 使用的角度考慮,我們采用qemu launcher設置qemu的各項參數,它的安裝可參考http://linuxman.blog.ccidnet.com/blog-htm-do- showone-uid-60710-type-blog-itemid-612280.html。

  在qemu launcher的linux配置標簽中,打勾直接啟動linux,然后在下面的文本框中填上剛才編譯好的內核映像文件的路徑名。因為qemu的運行還需要設置硬盤映像文件,所以還需要在左邊的配置標簽中新建一個硬盤映像文件,但實際上我們并不使用硬盤。

  配置好qemu的參數后,點擊launcher按鈕,內核就開始在qemu中運行了。內核輸出一堆內核運行信息后,最后打出了

  hello world, from init ramfs.

  哈哈,我們構建的init ramfs已經能夠正常工作了!

轉載于:https://www.cnblogs.com/linengier/archive/2013/03/30/2990293.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 示例_帶有示例的Python date isocalendar()方法

python 示例Python date.isocalendar()方法 (Python date.isocalendar() Method) date.isocalendar() method is used to manipulate objects of date class of module datetime. date.isocalendar()方法用于操作模塊datetime的日期類的對象。 It uses a date class object a…

mysql 函數重載_[賦值]函數,變量,重載 ,_第1頁_169IT

[java/j2ee] java實現簡單的給sql語句賦值的示例代碼本身很簡單。拼接sql的時候?不好數,簡單的用來賦值。代碼如下:/** * TODO 循環賦值,缺少的類型可隨時添加 * author Lucius * param pt * param list * throws SQLException */ public static…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

Opencv——寫入或讀取數據到XML或YAML文件

什么是XML、YAML文件 XML(eXtensible Markup Language)是一種元標記語言。所謂“原標記”,就是開發者可以根據自身需要定義的標記,任何滿足XML命名規則的名稱都可以標記。此外,XML是一種語義/結構化語言,它描述了文檔的結構和語義…

mysql 遷移 nosql_從關系型Mysql到Nosql HBase的遷移實踐

2013年11月22-23日,作為國內唯一專注于hadoop技術與應用分享的大規模行業盛會,2013 Hadoop中國技術峰會(China Hadoop Summit 2013)于北京福朋喜來登集團酒店隆重舉行。來自國內外各行業領域的近千名CIO、CTO、架構師、IT經理、咨詢顧問、工程師、Hadoop…

Oracle EBS數據定義移植工具:FNDLOAD

在實際的EBS二次開發中,我們經常會碰到需要在各個環境之間移植二次開發的程序對象以及數據定義,如在EBS二次開發中并發請求的定義會涉及到:可執行、并發程序、值集、請求組等的定義,定義需要從開發環境、測試環境、UAT環境一直到正…

21-特征匹配方法(Brute-Force蠻力匹配)

Brute-Force蠻力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示兩個特征點相互匹配 例如A中的第i個特征點與B中的第j個特征點最近,并且B中的第j個特征點到A中的第i個特征點也是 NORM_L2:歸一化數組的(歐幾里得距離),如果其他特征計算…

weakhashmap_Java WeakHashMap values()方法與示例

weakhashmapWeakHashMap類values()方法 (WeakHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get the values that exist in this map to be viewed in a collection. val…

Opencv——幾何空間變換(仿射變換和投影變換)

幾何空間變換【1】幾何變換(空間變換)簡述【2】變換矩陣知識簡述齊次坐標的概念幾何運算矩陣【3】圖像的仿射變換1、平移變換2、比例縮放3、旋轉4、對稱變換(不做展示)1、關于X軸變換2、關于Y軸變換3、關于直線YX變換4、關于直線Y…

用于主題檢測的臨時日志(e1784e6f-037e-45de-bad1-8bbc239818ee - 3bfe001a-32de-4114-a6b4-4005b770f6d7)...

這是一個未刪除的臨時日志。請手動刪除它。(578392f7-2207-4b01-b36d-c483f0699988 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)轉載于:https://www.cnblogs.com/Fly-sky/archive/2011/03/03/1969850.html

probuffer java_Protocol Buffer的使用

Probotbuf簡介在網絡通信和通用數據交換等應用場景中經常使用的技術是 JSON 或 XML,這兩種技術常被用于數據的結構化呈現和序列化。我們可以從兩個方面來看JSON 和 XML與protobuf的異同:一個是數據結構化,一個是數據序列化。這里的數據結構化…

根據DbSchema生成代碼2

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Threading; using System.IO; using Rocky;namespace Rocky.CodeBuilder {public class DbBuilder : Disposable{#region 字段public even…

22-隨機抽樣一致算法RANSAC

隨機抽樣一致算法(Random sample consensus,RANSAC) 看似復雜,其基本思想就是:隨機選取倆點,然后連接,給定一個容忍范圍,在這個范圍內的點越多越好,然后不斷的迭代進行找兩點之間容忍范圍內點最…

treeset比較器_Java TreeSet比較器()方法與示例

treeset比較器TreeSet類的compare()方法 (TreeSet Class comparator() method) comparator() method is available in java.util package. 比較器()方法在java.util包中可用。 comparator() method is used to get the Comparator object based on customizing order the eleme…

智能車復工日記【1】——菜單索引回顧

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 菜單回顧 1、系列文章解析結構元素菜單圖示菜單缺點:1、系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能…

[轉載]Oracle 11g R1下的自動內存經管(2)

AMM調整 除現有的用于內存經管的V$視圖外,Oracle 11g還新添加了下面4個視圖用于自動內存經管: ? ◆V$MEMORY_CURRENT_RESIZE_OPS ? ◆V$MEMORY_DYNAMIC_COMPONENTS ? ◆V$MEMORY_RESIZE_OPS ? ◆V$MEMORY_TARGET_ADVICE 轉載于:https://www.cnblogs.…

23-背景建模

幀差法 由于場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標&#xf…

DB2 9 運用開辟(733 考試)認證指南,第 3 部門: XML 數據獨霸(4)

議決運用順序存儲和檢索 XMLXML 編碼字符編碼在汗青上,術語 字符集、字符編碼 和 碼頁 都有雷同的意義:一個字符集和一個二進制碼集,其中每個碼示意一個字符。(碼頁是來自 IBM 的一個術語,示意一個大型主機或 IBM PC 上…

system.setin_Java System類setIn()方法及示例

system.setin系統類setIn()方法 (System class setIn() method) setIn() method is available in java.lang package. setIn()方法在java.lang包中可用。 setIn() method is used to assign again the standard input stream. setIn()方法用于再次分配標準輸入流。 setIn() met…

Opencv——霍夫變換以及遇到的一些問題

目錄問題1 :顏色空間轉換函數參數問題:CV_BGR2GRAY vs CV_GRAY2BGR問題2:cvRound()、cvFloor()、cvCeil()函數用法霍夫變換的含義標準霍夫直線變換霍夫線變換函數參數講解累計概率霍夫變換霍夫變換圓變換原理和算法步驟:霍夫圓變換…