Linux內(nèi)核中Kconfig文檔有什么作用?
內(nèi)核源碼樹的目錄下都有兩個(gè)文檔Kconfig(2.4版本是Config.in)和Makefile。分布到各目錄的Kconfig構(gòu)成了一個(gè)分布式的內(nèi)核配置數(shù)據(jù)庫,每個(gè)Kconfig分別描述了所屬目錄源文檔相關(guān)的內(nèi)核配置菜單。在內(nèi)核配置make menuconfig(或xconfig等)時(shí),從Kconfig中讀出菜單,用戶選擇后保存到。config的內(nèi)核配置文檔中。 在內(nèi)核編譯時(shí),主Makefile調(diào)用這個(gè)。config,就知道了用戶的選擇。
上面的內(nèi)容說明了,Kconfig就是對應(yīng)著內(nèi)核的配置菜單。假如要想添加新的驅(qū)動(dòng)到內(nèi)核的源碼中,能夠修改Kconfig,這樣就能夠選擇這個(gè)驅(qū)動(dòng),假如想使這個(gè)驅(qū)動(dòng)被編譯,要修改Makefile。
因此添加新的驅(qū)動(dòng)時(shí)需要修改的文檔有兩種(注意不只是兩個(gè))
*Kconfig
*Makefile
要想知道怎么修改這兩種文檔,就要知道兩種文檔的語法結(jié)構(gòu)。
First:Kconfig
每個(gè)菜單都有一個(gè)關(guān)鍵字標(biāo)識(shí),最常見的就是config。
語法:
config
symbol是個(gè)新的標(biāo)記的菜單項(xiàng),options是在這個(gè)新的菜單項(xiàng)下的屬性和選項(xiàng)
其中options部分有:
1、類型定義:
每個(gè)config菜單項(xiàng)都要有類型定義,bool布爾類型、 tristate三態(tài):內(nèi)建、模塊、移除 string字符串、 hex十六進(jìn)制、 integer整型
例如config HELLO_MODULE
bool "hello test module"
bool類型的只能選中或不選中,tristate類型的菜單項(xiàng)多了編譯成內(nèi)核模塊的選項(xiàng),假如選擇編譯成內(nèi)核模塊,則會(huì)在。config中生成一個(gè)CONFIG_HELLO_MODULE=m的配置,假如選擇內(nèi)建,就是直接編譯成內(nèi)核影響,就會(huì)在。config中生成一個(gè)CONFIG_HELLO_MODULE=y的配置。
2、依賴型定義depends on或requires
指此菜單的出現(xiàn)和否依賴于另一個(gè)定義
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
這個(gè)例子表明HELLO_MODULE這個(gè)菜單項(xiàng)只對XScale處理器有效。
3、幫助性定義
只是增加幫助用關(guān)鍵字help或---help---
Second:內(nèi)核的Makefile
在linux2.6.x/Documentation/kbuild目錄下有周詳?shù)慕榻B有關(guān)kernel makefile的知識(shí)。
內(nèi)核的Makefile分為5個(gè)組成部分:
Makefile 最頂層的Makefile
.config 內(nèi)核的當(dāng)前配置文檔,編譯時(shí)成為頂層Makefile的一部分
arch/$(ARCH)/Makefile 和體系結(jié)構(gòu)相關(guān)的Makefile
s/ Makefile.* 一些Makefile的通用規(guī)則
kbuild Makefile 各級目錄下的大概約500個(gè)文檔,編譯時(shí)根據(jù)上層Makefile傳下來的宏定義和其他編譯規(guī)則,將源代碼編譯成模塊或編入內(nèi)核。
頂層的Makefile文檔讀取 .config文檔的內(nèi)容,并總體上負(fù)責(zé)build內(nèi)核和模塊。Arch Makefile則提供補(bǔ)充體系結(jié)構(gòu)相關(guān)的信息。 s目錄下的Makefile文檔包含了任何用來根據(jù)kbuild Makefile 構(gòu)建內(nèi)核所需的定義和規(guī)則。
(其中。config的內(nèi)容是在make menuconfig的時(shí)候,通過Kconfig文檔配置的結(jié)果)
舉個(gè)例子:
假設(shè)想把自己寫的一個(gè)flash的驅(qū)動(dòng)程式加載到工程中,而且能夠通過menuconfig配置內(nèi)核時(shí)選擇該驅(qū)動(dòng)該怎么辦呢?能夠分三步:
第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/ 目錄下。
第二:修改/driver/mtd/maps目錄下的kconfig文檔:
config MTD_flashtest
tristate “ap71 flash"
這樣當(dāng)make menuconfig時(shí) ,將會(huì)出現(xiàn) ap71 flash選項(xiàng)。
第三:修改該目錄下makefile文檔。
添加如下內(nèi)容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
這樣,當(dāng)您運(yùn)行make menucofnig時(shí),您將發(fā)現(xiàn)ap71 flash選項(xiàng),假如您選擇了此項(xiàng)。該選擇就會(huì)保存在。config文檔中。當(dāng)您編譯內(nèi)核時(shí),將會(huì)讀取。config文檔,當(dāng)發(fā)現(xiàn)ap71 flash 選項(xiàng)為yes 時(shí),系統(tǒng)在調(diào)用/driver/mtd/maps/下的makefile 時(shí),將會(huì)把 flashtest.o 加入到內(nèi)核中。即可達(dá)到您的目的。