移植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總結
- 在系統啓動前期,init進程首先啓動action爲sysinit、wait、once的3類子進程
- 在系統正常運行期間,init進程首先啓動action爲respawn、askfirst的兩類子進程,並監視它們,發現某個子進程退出時重新啓動它
- 在系統退出時,執行action爲shutdown、restart、ctrlaltdel的3類子進程(之一或全部)
glibc庫
加載器ld-2.3.6.so、ld-linux.so.2
動態程序啓動前,它們被用來加載動態庫
目標文件(.o)
比如crt1.o、crti.o、crtn.o、gcrt1.o、mcrt1.o等。在生成應用程序時,這些文件像一般的目標文件一樣被連接
靜態庫文件(.a)
比如靜態數學庫libm.a、靜態c++庫libstdc++.a等,編譯靜態程序時會連接它們
動態庫文件(.so、.so.[0-9]*)
比如動態數學庫libm.so、動態c++庫libstdc++.so等,它們可能是一個鏈接文件
libtool庫文件(.la)
在連接庫文件時,這些文件會被用到。比如它們列出了當前庫文件所依賴的其它庫文件,程序運行時無需這些文件
gconv目錄
裏面是有頭字符集的動態庫
ldscripts目錄
裏面是各種連接腳本,在編譯應用程序時,它們被用於指定程序的運行地址、各段的位置等
readelf -a xxx.elf | grep “Shared”