第17-2章 移植Busybox

移植Busybox

所謂製作根文件系統,就是創建各種目錄,並且在裏面創建各種文件。比如/bin、/sbin目錄下存放各種可執行程序,在/etc目錄下存放配置文件,在/lib目錄下存放庫文件。

在創建一個最小的根文件系統時,使用Busybox的話,只需要在/dev目錄下創建必要的設備節點、在/etc目錄下創建一些配置文件就可以了,如果Busybox使用動態連接,還要在/lib目錄下包含庫文件

inittab文件解析

/etc/inittab文件中每個條目用來定義一個子進程,並確定它的啓動方法,格式如下:

<id>:<runlevels>:<action>:<process>
  • id:表示這個子進程要使用的控制檯(即標準輸入、標準輸出、標準錯誤設備)。如果省略,則使用與init進程一樣的控制檯

  • runlevels:對於Busybox init程序,這個字段沒有意義,可以省略

  • action:表示init進程如何控制這個子進程,有8種取值

action名稱 執行條件 說明
sysinit 系統啓動後最先執行 只執行一次,init進程等待它結束才繼續執行其它動作
wait 系統執行完sysinit進程後 只執行一次,init進程等待它結束才繼續執行其它動作
once 系統執行完wait進程後 只執行一次,init進程不等待它結束
respawn 啓動玩once進城後 init進程監測發現子進程退出時,重新啓動它
askfirst 啓動完respawn進城後 與respawn類似,不過init進程先輸出“Please press Enter to activate this console”,等用戶輸入回車鍵之後才啓動子進程
shutdown 當系統關機時 即重啓、關閉系統命令時
restart busybox中配置了CONFIG_FEATURE_USE_INITTAB,並且init進程接收到SIGHUP信號 先重新讀取、解析/etc/inittab文件,再執行restart程序
ctrlaltdel 按下ctrl+al+del組合鍵時 -

- process:要執行的程序,它可以是可執行程序,也可以是腳本。如果字段前有’-‘字符,這個程序被稱爲“交互的”。

inittab總結

  1. 在系統啓動前期,init進程首先啓動action爲sysinit、wait、once的3類子進程
  2. 在系統正常運行期間,init進程首先啓動action爲respawn、askfirst的兩類子進程,並監視它們,發現某個子進程退出時重新啓動它
  3. 在系統退出時,執行action爲shutdown、restart、ctrlaltdel的3類子進程(之一或全部)

glibc庫

  1. 加載器ld-2.3.6.so、ld-linux.so.2

    動態程序啓動前,它們被用來加載動態庫

  2. 目標文件(.o)

    比如crt1.o、crti.o、crtn.o、gcrt1.o、mcrt1.o等。在生成應用程序時,這些文件像一般的目標文件一樣被連接

  3. 靜態庫文件(.a)

    比如靜態數學庫libm.a、靜態c++庫libstdc++.a等,編譯靜態程序時會連接它們

  4. 動態庫文件(.so、.so.[0-9]*)

    比如動態數學庫libm.so、動態c++庫libstdc++.so等,它們可能是一個鏈接文件

  5. libtool庫文件(.la)

    在連接庫文件時,這些文件會被用到。比如它們列出了當前庫文件所依賴的其它庫文件,程序運行時無需這些文件

  6. gconv目錄

    裏面是有頭字符集的動態庫

  7. ldscripts目錄

    裏面是各種連接腳本,在編譯應用程序時,它們被用於指定程序的運行地址、各段的位置等

readelf -a xxx.elf | grep “Shared”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章