配置是構建內核的第一步。有許多方法和各種選項可供選擇。內核將在進程結束時生成一個 .config 文件,并生成一系列符號鏈接和文件頭,系統其余部分將使用這些文件來完成配置。
Linux內核是任何安裝的核心,無論是嵌入式還是桌面,它負責分配內存、創建進程、管理和調度數據,以及支持與其他系統交互所需的協議。Linux 桌面和服務器系統需要支持大量外圍設備,因為無法預測與每個操作系統相關的硬件。同樣,此類系統還必須支持廣泛的通信和數據交換協議,以便它們可以用于大量不同的目的。嵌入式設備通常需要支持一組特定的設備、外圍設備和協議,具體取決于給定設備中的硬件。
Linux 內核在支持它的處理器和設備的體系結構方面是高度可配置的。嵌入式設備的特定架構、處理器和硬件要求的配置是任何 Linux 項目的基礎。優化內核以支持特定硬件和協議,最大限度地減少其存儲大小和內存需求,從而對性能產生積極影響。
內核配置允許您選擇要包含在進程中的各種選項。有些選項可用,有些則不可用,這取決于嵌入式架構。無論硬件架構如何,可用于分析然后包含在處理配置中的主要選項如下:
- 代碼成熟度級別選項
- 常規設置
- 支持可加載模塊
- 塊層
- 聯網
- 設備驅動程序
- 文件系統
- 內核黑客
- 安全
- 文字學
- 庫例程
內核可以包括各種安全選項,作為美國國家安全局 (NSA) 實施的 SELinux 堆棧的一部分。Security-Enhanced Linux (SELinux) 是一組選項,可應用于 Linux 和 BSD 等類 Unix 操作系統;實際上,它是 Linux Kernel 的一個模塊,提供了一系列工具來實現安全協議。一個更重要的選項是您選擇最適合目標的處理器架構的確切實例。名稱根據其架構而有所不同。在表 1 中有一個內核選項和體系結構的列表,這些選項和體系結構根據通過使用 Makefile 內核識別的體系結構名稱設置變量“ARCH”而正確選擇的處理器。
可以使用的前端配置很多,主要參考2.6及以后的內核:
- 構建目標文件以渲染內核映像:選擇組件后,構建內核需要以下步驟:
- 生成依賴頭文件信息(哪個.c文件依賴哪個.h文件)。對于 2.6 及更高版本的內核,這不是必需的。
- 使用 make clean 命令,清理除配置信息外的所有目標文件、內核映像和所有中間文件。
- 創建內核映像。內核映像的名稱是 vmlinux。然而,編譯內核并不止于此。通常需要進行一些后處理,例如壓縮、添加引導代碼等。實際上,后處理將創建稍后將在目標中使用的圖像。
- 使用 make modules 命令構建可動態加載的模塊。通常,在嵌入式系統上,構建過程會進一步定制,原因如下:在單獨的目錄中添加 BSP 并修改配置,以便 kbuild 可以構建板所需的軟件組件;為構建過程添加您自己的鏈接器、編譯器和匯編器;構建內核映像后自定義后處理;在 kbuild 中構建協議以進行系統范圍的構建。
使用內核
Linux 內核可以通過以下兩種方式之一使用外圍驅動程序:編譯到內核中或按需動態加載。可加載內核模塊 (LKM) 被編譯為目標文件,隨后被編譯為與特定內核一起工作,以便動態加載以響應新的硬件要求。
可加載內核模塊(或 LKM)是一個目標文件,其中包含擴展正在運行的內核的代碼;它通常用于添加對新硬件和/或文件系統的支持,或添加系統調用。
LKM 作為文件存儲在內核之外,存儲在物理文件系統或內核可以訪問的內存中。
雖然內核模塊的動態加載確實有一些開銷,但該開銷的成本被 LKM 在開發和部署期間提供的靈活性所抵消。因此,內核和相關的設備驅動程序配置主要是區分強制設備和按需協議的問題。在 Linux 桌面或服務器系統上,對 PATA 或 SATA 硬盤驅動器等日常設備的支持通常編譯到內核中,因為這些設備存在于大多數計算機系統中。作為一般規則,引導系統所需的硬件外圍驅動程序通常內置在 Linux 內核中,以便它們可以自動可用。一旦系統啟動,Linux 就可以訪問內存或文件系統,并可以通過 LKM 加載幾乎任何其他硬件的驅動程序。
Linux 內核使用稱為 kconfig 的集成機制進行配置,該機制通過自動滿足不同驅動程序之間的依賴關系來簡化架構、處理器和設備驅動程序的選擇。Timesys Desktop 提供內置的 kconfig 支持,還將其擴展為 Linux 嵌入式開發項目其他部分的簡單配置機制,例如操作系統基礎架構和應用程序選擇和支持。
現代 Linux 系統不是通過預先創建(和保留)每個可能的設備節點來浪費空間,而是支持一種按需創建節點的機制,稱為 udev。當檢測到新硬件時,該守護進程創建強制設備節點來運行適用于檢測到的特定硬件或設備類別的一個或多個規則。
動態創建設備的完整性取決于Linux系統初始化和識別硬件的順序,這可能并不總是以相同的順序發生。如果不考慮,這可能會導致以太網接口以不同的順序命名。這將使系統難以配置以不同方式管理設備或將它們用于特定目的。為了消除此類問題,在靜態和動態設備創建之間提供正確的折衷方案,udev 守護程序會為某些類別的檢測到的設備創建更新并保存一組規則。當 Linux 系統重新啟動時,這些規則與任何其他 udev 規則一樣用于響應硬件檢測。但是,由于它們還包含特定的命名分配,因此每次系統重新啟動后設備映射都是相同的。
對于僅訪問一組特定設備的嵌入式設備,為硬件預先創建靜態節點消除了運行 udev 的需要,從而減少了內存和存儲需求。另一方面,在設計用于與不一定預期的外圍設備一起使用的嵌入式設備中,例如 USB 設備,udev 機制提供了默認系統最初所需的設備節點。
交叉編譯準備:“ARCH”和“CROSS_COMPILE”
內核對架構的選擇是通過兩個變量進行的。變量是“ARCH”和“CROSS_COMPILE”,默認值顯示在存儲在源根目錄中的 Makefile 中(圖 2)。變量 'ARCH' 以特定內核格式指示目標體系結構的名稱:i386(arch / 子目錄將給出不同體系結構的概念)。'CROSS_COMPILE' 變量是不言自明的,用工具鏈前綴增強:也就是說,如果我們考慮 x86_64-pc-linux-gnu-gcc,那么寫 x86_64-pc-linux-gnu 就足夠了。/lib 庫目錄是根據附加變量“INSTALL_MOD_PATH”創建的,其中還存儲了每個所需模塊在編譯時所需的所有模塊。系統的準備以兩種方式進行:通過修改 Makefile 或通過從命令行評估變量。也可以通過腳本 (xmake) 設置命令并在內核編譯期間運行它們(圖 3)。
配置方法
Linux 內核構建系統 (kbuild) 包括對多種配置方法的支持,例如:
make config,它提供了一個命令行界面,提示您設置每個選項。如果配置配置文件已經存在,則該文件用于設置默認值。
make oldconfig,具有現有文件的配置,僅用于先前未配置的選項。這與 make config 形成對比,后者需要所有選項,甚至是以前配置的選項。開發人員經常使用此選項來更新他們的配置,而無需重新配置整個內核。
make menuconfig(圖 4):在終端上顯示配置菜單。如果存在 .config 文件,則它用于設置默認值,例如 make config。
make xconfig(圖 5),它顯示基于 Tk 的 X Window 配置菜單(Tk 工具包是用于在 X Window 系統下構建 GUI 的編程環境)。如果存在 .config 文件,則它用于設置默認值,就像 make config 和 menuconfig 一樣。
這些中的每一個都可用于配置內核。它們都在根內核源目錄中生成一個 .config 文件(該文件包含所選選項的完整詳細信息)。
很少有開發人員真正使用 makeconfig 命令來配置內核。相反,大多數使用 make menuconfig 創建初始配置或修改現有配置。要查看內核配置菜單,您必須在命令行中鍵入適當的命令并使用正確的參數。例如,要編譯用于集成 ARM 系統的 Linux 內核,可以使用以下命令行: $ Make ARCH = arm CROSS_COMPILE = arm-linux-menuconfig。
配置內核后,內核配置系統會要求您保存新配置。除了創建 .config 文件之外,還會創建一些頭文件和符號鏈接。也可以在不進行任何更改的情況下退出內核配置。
除了主要的配置選項外,內核架構支持通常包括用于某些目標的標準模型配置。對于標準 ARM 處理器尤其如此。在這些情況下,內核提供的默認值將用于生成 .config 文件。
通常需要測試使用相同內核源的不同配置。但是,更改內核配置會破壞以前的配置,因為所有配置文件都被內核配置實用程序覆蓋。要保存配置以供將來使用,您需要保存以前創建的 .config 文件。然后可以重用這些文件來恢復以前的內核配置。
您還可以輕松地保存 .config 文件,即將內核配置實用程序創建的配置文件復制到備用位置以供將來使用。要使用已保存的配置,您需要將之前保存的 .config 文件復制回內核根目錄,然后使用 Makefile oldconfig 命令使用新復制的 .config 文件配置內核。
與內核一樣,應用程序也必須使用開發工具來構建。大多數開源程序都遵循 GNU 編譯標準,該標準是幾個工具的集合,下面列出了其中最重要的工具。
– autoconf:提供一個通用的可移植性框架,基于編譯時主機系統特性的測試。
– automake:允許開發人員編寫簡化的 Makefile。
– libtool:創建共享庫的標準化方法
測試內核
一般來說,有很多方法可以測試 Linux 內核:
- 帶有內核的試用版。
- 通過在新內核上將測試套件作為 LTP 運行。
- 通過使用新安裝的內核測量系統性能。
第一個測試階段包括使用 init = / bin / bash 在功能齊全的配置中引導系統。從那里,您可以檢查文件系統是否正確掛載和卸載,并且可以嘗試一些更復雜的內核功能,例如以最小配置掛起到磁盤或 RAM。接下來,您可以將系統引導到運行級別 3(通常,將數字 2 作為參數傳遞給內核)。在此配置中,您可以檢查網絡接口,您可以嘗試手動運行 X 服務器以確保它不會崩潰。在下一個測試階段,您可以使用旨在通過回歸和性能測試驗證內核功能的特殊程序。后者對于內核開發人員來說尤其重要,因為它們有助于識別由于更新引起的變化。
對于自動化內核測試,您可以使用 AutoTest 套件,其中包括許多測試應用程序和工具,并結合了簡單的用戶界面。上面看到的運行級別是一個典型的 UNIX 系統概念,代表機器的活動狀態。每個運行級別由一個數字標識:
- 運行級別 0:停止系統。
- 運行級別 1(單用戶模式):用于維護活動。
- 運行級別 2(多用戶模式):啟用網絡但沒有網絡服務。
- 運行級別 3(多用戶模式):啟用所有網絡功能,并激活所有相關服務。
- Runlevel 4:一般不使用;
- 運行級別 5:類似于運行級別 3 加上啟用的圖形服務器;
- 運行級別 6:用于系統重啟。
文件系統
Linux 內核在系統引導期間所做的最后一件事是掛載根文件系統。Linux 內核沒有規定文件系統結構,但用戶空間應用程序希望在目錄結構中找到具有特定名稱的文件。
配置內核的下一步是創建根文件系統(圖 6)。可以使用兩種主要技術:initrd / initramfs 和使用 NFS 通過網絡安裝根預文件系統。Initrd(ini??tial ramdisk),從內核 2.6 版開始在 Linux 中引入,是一個小型臨時文件系統,在引導過程的初始階段充當安裝在內存中的根文件系統,可通過引導加載程序訪問內核.
?
?
? 審核編輯:湯梓紅
評論
查看更多