大多數(shù)嵌入式設備都是為了在通常資源受限或低規(guī)格的設備上執(zhí)行特定任務而構(gòu)建的。
因此,大多數(shù)嵌入式開發(fā)人員需要去除不必要的庫和模塊,并為其特定設備和用例創(chuàng)建自定義分發(fā)。我們先來了解一下嵌入式 Linux
系統(tǒng)有哪些組件。
引導加載程序
從技術(shù)上講,它位于系統(tǒng)之外,其運行方式與首先運行 BIOS
的臺式機或服務器系統(tǒng)不同。在嵌入式系統(tǒng)上,硬件啟動負責基本初始化和執(zhí)行內(nèi)核的引導加載程序。在嵌入式系統(tǒng)上,這可以通過以下方式處理:GRUB、LILO 或 Das
U-Boot。后者專門用于嵌入式設備。
Linux內(nèi)核
包含進程和內(nèi)存管理、網(wǎng)絡堆棧、設備驅(qū)動程序,并為任何用戶空間應用程序提供服務。引導加載程序?qū)?nèi)核加載到內(nèi)存中并運行它。內(nèi)核尋找首先運行的“init”程序。
“Init”程序負責啟動其他服務,例如硬件驅(qū)動程序、文件系統(tǒng)驅(qū)動程序、文件系統(tǒng)掛載、服務和其他應用程序。內(nèi)核只知道 init
程序,如果找不到它,就會“內(nèi)核崩潰”。
嵌入式系統(tǒng)上的內(nèi)核與臺式機等大型系統(tǒng)中的內(nèi)核相同。主要區(qū)別在于嵌入式 Linux 內(nèi)核專為在不同的 CPU
架構(gòu)上運行而構(gòu)建。
根文件系統(tǒng)
根文件系統(tǒng)包含 C 庫和 Linux
服務/命令,以及其他必要的腳本。在嵌入式開發(fā)中,文件系統(tǒng)是內(nèi)核和用戶空間應用程序之間的接口。在初始化時,內(nèi)核將每個程序加載到內(nèi)存中,并希望將它們組織到文件和目錄中。這是根文件系統(tǒng),應該提前創(chuàng)建并掛載到“/”,然后內(nèi)核才能啟動“init”。
用戶空間
用戶空間是任何自定義應用程序或服務所在的地方。 init
程序還負責將這些加載到內(nèi)存中。大多數(shù)嵌入式系統(tǒng)都是執(zhí)行特定功能的單一用途應用程序,因此嵌入式系統(tǒng)上的應用程序往往是精簡和最小化的。在目標嵌入式處理器上運行
Linux 需要至少 8MB 的 RAM,大多數(shù)應用程序至少需要 32MB 的 RAM。 RAM 的實際要求取決于你的嵌入式應用程序的大小。除了 RAM
之外,還需要至少 4MB 的存儲內(nèi)存。它可以是以下類型之一:NAND 或 NOR 閃存、SD 或 MMC 卡。
主板支持包
主板支持包包含驅(qū)動程序和其他軟件,它們與你正在運行的特定硬件和操作系統(tǒng)相連接。 對于 Linux
系統(tǒng),每種電路板類型都有自己的一組 BSP。在嵌入式開發(fā)某些情況下,如果你需要硬件來執(zhí)行默認 BSP
中未包含的特定功能,你可能需要自定義這些并編寫你自己的驅(qū)動程序來支持你的特定應用程序。