hello程序直接編譯進內核:
第一;先將hello.c拷貝到在內核源代碼中drivers/char/,vi /drivers/char/Kconfig
添加 config HELLO_DRIVER
bool(tristate) "my hello driver"。然後回到源代碼目錄下make menuconfig,在文本菜單Device Drivers——>character devices就可以發現my hello driver的選項。如果是bool就有兩個選項(*和空),如果是tristate就有三個選項(*、空和m),選擇空就可在源代碼目錄vi .config文件查找HELLO(/HELLO),發現CONFIG_HELLO_DRIVER is not set(選*則=y,選m=m)。
第二;在內核源代碼中vi /drivers/char/Makefile,添加obj-$(CONFIG_HELLO_DRIVER) +=hello.o。這樣就可以將hello.c驅動程序直接編譯進內核
Kconfig文件的作用
內核源碼樹的目錄下都有兩個文件Kconfig(2.4版本是Config.in)和Makefile。分布到各目錄的Kconfig構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文件中。在內核編譯時,主Makefile調用這個.config,就知道了用戶的選擇。
*上面的內容說明了,Kconfig就是對應著內核的配置菜單。如果要想添加新的驅動到內核的源碼中,可以修改Kconfig,這樣就可以選擇這個驅動,如果想使這個驅動被編譯,要修改Makefile
so添加新的驅動時需要修改的文件有兩種(注意不只是兩個)
*Kconfig
*Makefile
要想知道怎麼修改這兩種文件,就要知道兩種文件的語法結構
Kconfig
每個菜單都有一個關鍵字標識,最常見的就是config
語法:
config
symbol是一個新的標記的菜單項,options是在這個新的菜單項下的屬性和選項
其中options部分有:
1、類型定義:
每個config菜單項都要有類型定義,bool布爾類型、 tristate三態:內建、模塊、移除 string字符串、 hex十六進制、 integer整型
例如config HELLO_MODULE
bool "hello test module"
bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成內核模塊的選項,如果選擇編譯成內核模塊,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置,如果選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置.
2、依賴型定義depends on或requires
指此菜單的出現與否依賴於另一個定義
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效。
3、幫助性定義
只是增加幫助用關鍵字help或者---help---
內核的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_flashtest
tristate “ap71 flash"
這樣當make menuconfig時 ,將會出現 ap71 flash選項。
第三:修改該目錄下makefile文件。
ü 添加如下內容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
這樣,當你運行make menucofnig時,你將發現ap71 flash選項,如果你選擇了此項。該選擇就會保存在.config文件中。當你編譯內核時,將會讀取.config文件,當發現ap71 flash 選項為yes 時,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到內核中。即可達到你的目的。