2009年7月30日 星期四

Linux kenel Kconfig的作用

kenel程式碼的目錄下都有兩個檔案Kconfig(2.4版本是 Config.in)和Makefile。分佈到各目錄的Kconfig構成了一個分散式的kernel配置資料庫,每個Kconfig分別描述了所屬目錄程式碼 相關的kenel配置功能表。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出功能表,用戶選擇後保存到.config的內核配置文檔中。 在內核編譯時,Makefile利用這個.config,就知道了用戶的選擇。
上面的內容說明了,Kconfig就是對應著kernel的配置功能表。假如要想添加新的驅動到內核的源碼中,能夠修改Kconfig,這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,要修改Makefile。

因此添加新的驅動時需要修改的文檔有兩種(注意不只是兩個)
*Kconfig
*Makefile
要想知道怎麼修改這兩種文檔,就要知道兩種文檔的語法結構。
First:Kconfig
每個功能表都有一個關鍵字標識,最常見的就是config。
語法:config
symbol是個新的標記的功能表項,options是在這個新的功能表項下的屬性和選項
其中options部分有:
1、類型定義:每個config功能表項都要有類型定義,bool布林類型、 tristate三態:內建、模組、移除 string字串、 hex十六進位、 integer整型
例如config HELLO_MODULEbool "hello test module"
bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成kernel module的選項,假如選擇編譯成內核模組,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置,假如選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置.
2、依賴型定義depends on或requires指此功能表的出現和否依賴于另一個定義
config HELLO_MODULEbool "hello test module"depends on ARCH_PXA
這個例子表明HELLO_MODULE這個功能表項只對XScale處理器有效。
3、説明性定義只是增加幫助用關鍵字help或---help---
Second:內核的Makefile在Linux2.6.x/Documentation/kbuild目錄下有周詳的介紹有關kernel makefile的知識。
內核的Makefile分為5個組成部分: Makefile 最頂層的Makefile .config 內核的當前配置文檔,編譯時成為頂層Makefile的一部分arch/$(ARCH)/Makefile 和體系結構相關的Makefile s/ Makefile.* 一些Makefile的通用規則 kbuild Makefile 各級目錄下的大概約500個文檔,編譯時根據上層Makefile傳下來的巨集定義和其他編譯規則,將源代碼編譯成模組或編入內核。
頂層的Makefile文檔讀取 .config文檔的內容,並總體上負責build內核和模組。Arch Makefile則提供補充體系結構相關的資訊。 s目錄下的Makefile文檔包含了任何用來根據kbuild Makefile 構建內核所需的定義和規則。
(其中.config的內容是在make menuconfig的時候,通過Kconfig文檔配置的結果)
舉個例子:假設想把自己寫的一個flash的驅動程式載入到工程中,而且能夠通過menuconfig配置內核時選擇該驅動該怎麼辦呢?能夠分三步:
第一:將您寫的flashtest.c 文檔添加到/driver/mtd/maps/ 目錄下。
第二:修改/driver/mtd/maps目錄下的kconfig文檔:config MTD_flashtesttristate “ap71 flash"
這樣當make menuconfig時 ,將會出現 ap71 flash選項。

沒有留言:

張貼留言