一、導讀
本文描述buildroot中支持的三種系統初始化方式以及buildroot在實際構建過程中是如何工作的。
二、系統初始化的三種方式
我們已經知道,在linux內核啟動后期會嘗試加載用戶空間的init程序,init程序是由內核啟動的第一個用戶空間程序(PID為1),該程序負責啟動用戶空間的服務和程序(例如:Web服務、圖形應用程序、其他網絡服務等)。
在使用buildroot構建linux根文件系統時,其支持三種不同類型的初始化系統,可以在“System configuration”選項下的“Init system”選擇項中進行選擇:

(1)第一種是“BusyBox”
BusyBox 實現了基本的 init 程序,對于大多數嵌入式系統而言,選擇這種方式已經足夠了。啟用“BR2_INIT_BUSYBOX”將確保 BusyBox 會生成并安裝其 init 程序,這也是 Buildroot 的默認解決方案。
BusyBox init程序會在啟動時去讀取/etc/inittab文件。除了掛載一些重要的文件系統之外,默認的 inittab 的主要工作是啟動/etc/init.d/rcS shell腳本,并啟動一個 getty 程序(用于提供登錄提示)。
(2)第二種是“systemV”
該種解決方案使用傳統的sysvinit程序,位于Buildroot目錄package/sysvinit中,在Upstart或Systemd出現之前,這是大多數桌面Linux發行版使用的解決方案。Sysvinit同樣使用inittab文件(其語法與 BusyBox 中的語法略有不同)。與此init解決方案一起安裝的默認inittab 位于package/sysvinit/inittab中。
(3)第三種是“systemd”
systemd是用于Linux的新一代init系統。它的功能遠遠超過傳統的init程序:強大的并行處理能力、使用socket和D-Bus激活啟動服務、按需啟動守護程序、使用Linux控制組跟蹤進程、支持對系統狀態進行快照和還原等等。
systemd在相對復雜的嵌入式系統上很有用,例如:需要D-Bus和服務之間相互通信的系統。值得注意的是systemd會帶來了大量的大型依賴項,例如dbus、udev等。
buildroot如何工作
本小節描述buildroot的工作機制。
在《buildroot使用筆記-01 | 常規使用步驟》一文中,對buildroot的目錄結構進行了分析,可以明確知道:buildroot基本上是一組Makefile文件,這些文件可以對所需軟件進行下載、配置和編譯。除此之外,buildroot中還包含了各種軟件包的補丁:主要是那些涉及交叉編譯工具鏈的軟件包,例如:gcc、binutils和uClibc等。
對于軟件包來說,每個軟件包基本上只有一個Makefile文件,它們以.mk擴展名進行命名。在buildroot中,Makefile分成許多不同的部分:
toolchain/目錄包含與交叉編譯工具鏈相關的所有軟件的Makefile和相關文件:binutils、gcc、gdb、kernel-header 和 uClibc。
arch/目錄包含 Buildroot 支持的所有處理器體系架構的定義。
package/目錄包含所有用戶空間的工具和庫(Buildroot 可以將它們編譯并添加到目標根文件系統)的 Makefile 和相關文件,每個軟件包都有一個子目錄。
linux/目錄包含 Linux 內核的 Makefile 和相關文件。
boot/目錄包含 Buildroot 支持的 Bootloader 的 Makefile 和相關文件。
system/目錄包含對系統集成的支持,例如目標文件系統框架 skeleton 和 init 系統的選擇。
fs/目錄包含與生成目標根文件系統鏡像有關的軟件的 Makefile 和相關文件。
每個目錄至少包含2個文件:
xxx.mk 是用于下載、配置、編譯和安裝軟件包的Makefile。
Config.in 是配置工具描述文件的一部分,用于描述與軟件包相關的選項。
在buildroot配置完成后,主Makefile執行的具體操作步驟如下:
(1)創建所有的輸出目錄:staging、target、build 等(默認在output/目錄中,我們可以使用“O=”來指定另一個路徑)。
(2)生成工具鏈目標。當使用內部工具鏈時,這意味著buildroot會生成交叉編譯工具鏈。當使用外部工具鏈時,這意味著將檢查外部工具鏈的功能并將其導入到Buildroot環境中。
(3)生成TARGETS變量中列出的所有目標。該變量由所有組件的 Makefile 填充。生成這些目標時將生成用戶空間軟件包(庫、程序集)、內核、引導加載程序的編譯以及根文件系統鏡像,在該過程中,會聯網命中、下載所需要的軟件包,然后對其進行編譯構建。在編譯構建過程中,單個操作步驟一般會顯示對應的下載進度提示,過程進度提示等。在執行對應的操作時,還會有相應的提示,類似于下圖所示的信息:

審核編輯:劉清
-
PID控制
+關注
關注
11文章
464瀏覽量
42473 -
LINUX內核
+關注
關注
1文章
321瀏覽量
23212 -
gcc編譯器
+關注
關注
0文章
78瀏覽量
3990
原文標題:buildroot使用筆記-03 | 系統初始化的三種方式和buildroot的工作方式
文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
RT-Thread自動初始化詳解
RT-Thread系統初始化與啟動流程詳細描述
LINUX系統引導和初始化-LINUX內核解讀
8253初始化程序分享_8253應用案例
霍爾無刷電機如何進行程序初始化?
FPGA的三種配置方式詳解
GraniStudio:初始化例程
EtherCAT總線初始化步驟
描述buildroot中支持的三種系統初始化方式
評論