天天看點

linux下config檔案,linux config 檔案

除了 Makefile 的編寫,另外一個重要的工作就是把新功能加入到 Linux 的配置選項中,提供此項功能的說明,讓使用者有機會選擇此項功能。所有的這些都需要在 config.in 檔案中用配置語言來編寫配置腳本,

在 Linux 核心中,配置指令有多種方式:

配置指令解釋腳本

Make config, make oldconfigscripts/Configure

Make menuconfigscripts/Menuconfig

Make xconfigscripts/tkparse

字元界面配置(make config)為例,頂層 Makefile 調用 scripts/Configure, 按照

arch/arm/config.in 來進行配置。指令執行完後産生檔案 .config,其中儲存着配置資訊。下一次再做 make config

将産生新的 .config 檔案,原 .config 被改名為 .config.old

核心配置子系統

核心源碼目錄的頂層Makefile負責用來建構[核心鏡像]和[動态加載子產品]二者。它通過遞歸源碼樹的子目錄來實作的,具體進入哪些子目錄取決于元件的選擇,也就是核心配置。

配置什麼?

每種體系統都會輸出元件清單給核心配置時選擇,元件類型包括:

第一,處理器特性;

第二,硬體載闆;

第三,載闆特殊的硬體配置;

第四,核心子系統元件(這些元件或多或少是獨立于體系的,比如網絡協定棧)

配置庫

每種體系都關聯着一個元件資料庫,此庫以檔案形式儲存在arch/$ARCH目錄下。2.4版是config.in,2.6版是Kconfig。在配置核心時,此檔案會被解釋(parsed)來提供元件選擇。如果你要新增硬體特征[配置項

],你得修改此檔案。

配置語言

雖然核心配置使用make指令,[核心配置子系統

]的配置庫使用了一種不同的配置描述語言,并且2.4與2.6都有所不同。這種語言文法很簡單,很接近自然語言,這裡不詳述,隻談使用技術。

什麼是[核心配置子系統

]?為什麼可以使用不同的腳本語言?

因為配置過程是整個核心建構過程的串行子部分,産出特定的配置資訊,是以完全可以使用獨立的更簡單的領域特定語言(domain-specific language)。

第一,每一個核心子部分(subsection)都有單獨的配置檔案定義配置規則,比如,網絡部分,配置資訊儲存在子目錄下的

Kconfig。體系相關的配置檔案會導入這個檔案,例如,在2.4版,MIPS的體系配置檔案(arch/mips/config-

shared.in)有一行用來導入VFS的配置(fs/config.in)配置規則。

第二,配置檔案.config通過名值對(name=value )儲存[配置項

]。配置項的名有字首CONFIG_,後面跟着定義在配置檔案裡的元件名。配置項的值有如下幾種:

布爾值:y or n

三态值(tristate): y, n, or m(module)

字元串:

整型:

十六進制數值:

第三,配置變量可以被定義為是否需要使用者指定,如果不需要,配置變量使用預設值;

第四,可以為配置變量定義依賴;依賴性用來決定配置項的可見性;

第五,每個配置變量都關聯一個幫助文本。

那麼[核心配置子系統]是如何将被選擇的元件資訊輸出到kbuild的呢?[核心配置子系統]在使用者完全配置操作後會生成一個配置檔案.config,内有已標明元件的[名值對]清單。頂層的makefile通過包含.config來達到元件選擇。

對源碼進行配置

除了[makefile規則]需要[配置資訊]進行動态生成外,核心源碼内同樣有代碼依賴配置資訊。比如2.4版核心源碼init/main.c 有如下代碼:

#ifdef CONFIG_PCI

pci_init();

#endif

宏CONFIG_PCI定義與否的資訊來自使用者配置操作。為了把配置資訊傳遞入源碼,kbuild

得把[名值對]翻譯成宏定義,儲存在include/linux/autoconf.h。然後,這個頭檔案會被分拆為多個頭檔案,儲存在include

/config目錄。例如上面的例子,CONFIG_PCI生成一個include/config/pci.h與之對應,内有一行: