Linux內核中的Kconfig、Makefile、.config

http://www.cnblogs.com/taomaomao/archive/2012/01/05/2312816.html  

   本文參考友善之臂的MICRO2440用戶手冊

毛毛同學今天學習了驅動程序模塊的安裝與卸載,在這個過程中毛毛髮現,內核的目錄中有許多的Kconfig、Makefile文件,但是毛毛不知道爲什麼需要這些文件,這些文件又是用來做什麼的。下面我們就和陶毛毛同學一起來學習下這些文件的作用是什麼。 
        首先我們來學習什麼Makefile,什麼是Kconfig ,什麼是.config 
        Makefile:一個文本形式的文件,其中包含一些規則告訴make編譯哪些文件以及怎樣編譯這些文件。

         Kconfig:一個文本形式的文件,其中主要作用是在內核配置時候,作爲配置選項。

         .config:文件是在進行內核配置的時候,經過配置後生成的內核編譯參考文件。

Kconfig

1.先了解一下Kconfig的語法: 
一個典型的內核配置菜單如下: 
menu "Network device support" 
config NETDEVICES 
        bool "Enable Net Devices" 
        depends on NET 
        default y 
       help 
               This is help desciption。 
... 
endmenu 
包含在menu/endmenu中的內容會成爲Network device support的子菜單。每一個子菜單項都是由config來定義的。congfig下方的那些bool、depends on、default、help等爲config的屬性,用於定義該菜單項的類型、依賴項、默認值、幫助信息等。 
2. 補充說明一下類型定義部分: 
每個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的配置. hex十六進制類型顯示爲( )。

3. 目錄層次迭代 
在Kconfig中有類似語句:source "drivers/usb/Kconfig" 
用來包含(或嵌套)新的Kconfig文件,這樣便可以使各個目錄管理各自的配置內容,使不必把那些配置都寫在同一個文件裏,方便修改和管理。

----------------------------------------------------------------------------------------------

Makefile 
2.6內核的Makefile分爲5個組成部分: 
       1. 最頂層的Makefile 
       2. 內核的.config配置文件 
       3.   在arch/$(ARCH) 目錄下的體系結構相關的Makefile 
       4. 在s目錄下的 Makefile.* 文件,是一些Makefile的通用規則 
       5. 各級目錄下的大概約500個kbuild Makefile文件

頂層的Makefile文件讀取 .config文件的內容,並總體上負責build內核和模塊。Arch Makefile則提供補充體系結構相關的信息。 s目錄下的Makefile文件包含了所有用來根據kbuild Makefile 構建內核所需的定義和規則。

Kbuild Makefile 
對於Makefiles的不同組成部分,有一些不同的語法規則。針對的對象也不同,對於大部分內核模塊或設備驅動的開發者和使用者來說,最常接觸到的就是各層目錄下基於kbuild架構的kbuild Makefile文件。Kbuild Makefile核心內容主要包括: 
1.目標定義 
目標定義就是用來定義哪些內容要做爲模塊編譯,哪些要編譯鏈接進內核。如:

obj-y += foo.o

表示要由foo.c或者foo.s文件編譯得到foo.o並鏈接進內核,而obj-m則表示該文件要作爲模塊編譯。 除了y,m以外的obj-x形式的目標都不會被編譯。而更常見的做法是根據.config文件的CONFIG_ 變量來決定文件的編譯方式(該變量如何起作用見文末另一篇文章的鏈接),如: 
obj-$(CONFIG_EXT2) += ext2.o

除了obj-形式的目標以外,還有lib-y library庫,hostprogs-y 主機程序等目標,但是基本都應用在特定的目錄和場合下。

例子說明:

下面我們以實例來說明這幾個文件的作用

Step1:編輯配置文件Kconfig,加入驅動選項,使之在make menuconfig 的時候出現 
打開 linux-2.6.32.2/drivers/char/Kconfig 文件,添加如圖所示:

image

保存退出,這時在linux-2.6.32.2 目錄位置運行一下make menuconfig 就可以在Device 
Drivers Character devices 菜單中看到剛纔所添加的選項了,按下空格鍵將會選擇爲<M>, 
此意爲要把該選項編譯爲模塊方式;再按下空格會變爲<*>,意爲要把該選項編譯到內核中, 
在此我們選擇<M>,如圖:

image

Step2:通過上一步,我們雖然可以在配置內核的時候進行選擇,但實際上此時執行編譯內核還是不能把mini2440_hello_module.c 編譯進去的,還需要在Makefile 中把內核配置選項和真正的源代碼聯繫起來,打開linux-2.6.32.2/drivers/char/Makefile,如圖添加並保存退出:

image

 

Step3:這時回到linux-2.6.32.2 源代碼根目錄位置,執行make modules,就可以生成我們所需要的內核模塊文件 mini2440_hello_module.ko 了,如圖:至此,我們已經完成了模塊驅動的編譯。

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章