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