1 Kconfig和Makefile
毫不誇張地說,Kconfig和Makefile是我們浏覽內核代碼時最為依仗的兩個文件。基本上,Linux 內核中每一個目錄下邊都會有一個Kconfig文件和一個Makefile文件。Kconfig和Makefile就好似一個城市的地圖,地圖引導我們去 認識一個城市,而Kconfig和Makefile則可以讓我們了解一個內核目錄下面的結構。在希望研究內核的某個子系統、某個驅動或其他某個部分時,都 有必要首先仔細閱讀一下相關目錄下的Kconfig和Makefile文件。
分布到各目錄的Kconfig構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文檔相關的內核配置菜單。在內核配置make menuconfig時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文檔中。 在內核編譯時,主Makefile調用這個.config,就知道了用戶的選擇。
假如想使這個驅動被編譯,則要修改Makefile文件,因此,需要添加新的驅動時,需要修改的文件有兩個:Kconfig,Makefile.
2 菜單組織結構
一般一個Kconfig文件表示的就是一個菜單,一個菜單由多個菜單項組成,其格式如下:
- menu 菜單名
-
- 菜單項或菜單鏈接1
- 菜單項或菜單鏈接2
- ...
- 菜單項或菜單鏈接n
-
- endmenu
其中菜單項就是指菜單的子菜單,所謂菜單鏈接就是指鏈接到另一個Kconfig文件,如此一下,菜單就可以實現隨意嵌套了.
例如:
- # drivers/Kconfig
- menu "Device Drivers"
- source "drivers/base/Kconfig"
- source "drivers/connector/Kconfig"
- source "drivers/mtd/Kconfig"
- source "drivers/of/Kconfig"
- source "drivers/parport/Kconfig"
- source "drivers/pnp/Kconfig"
- source "drivers/block/Kconfig"
- source "drivers/hello/Kconfig"
- config test
- bool "提示字符串"
- default y
- ...
- endmenu
2.1 菜單項
語法:
- config <symbol>
- <config options>
<symbol>為一符號,就好像代碼中的局部變量x一樣,可用於後邊的表達式中.
例如:
- config UEVENT_HELPER_PATH
- string "path to uevent helper"
- depends on HOTPLUG
- default "/sbin/hotplug"
- help
- Path to uevent helper program forked by the kernel for
- every uevent.
上面菜單項的屬性string表示菜單的類型,每一個菜單項必須有一個類型.
注:每個config菜單項都會產生一個配置選項CONFIG_XXX, XXX即為<symbol>. 如上,則會產生一個配置項:CONFIG_UEVENT_HELPER_PATH,此配置項的值記錄在內核根目錄下的隱藏文件.config內, 例:~/WORKING_DIRECTORY/kernel/goldfish/.config文件內.
2.2 菜單鏈接
菜單鏈接的格式如下:
- source "路徑"
如:
- source "drivers/pnp/Kconfig"
2.3 菜單屬性
2.3.1 類型
類型可以是:bool、tristate、string、hex和int。
bool類型的只能選中或不選中,選中為y,不選中為n.
tristate類型的菜單項為值可為三種值,多了編譯成內核模塊的選項。其值可為y,n,m.
string類型表示需要用戶輸入一串字符串。
hex類型則需要用戶輸入一個16進制數。
int類型表示用戶輸入一個整型.
總結:
菜單類型屬性就好比一個控件,bool相當於單選框,trstate相當於有三種狀態的復選框,string相當於供用戶輸入字符串的文本編輯框,hex相當於供用戶輸入16進制數的文本編輯框,而int就相當於供用戶輸入整型數的文本編輯框。
類型關鍵字後邊可跟隨提示字符,也可以不跟隨,取決於情況。如:
- string "path to uevent helper"
- bool "Prevent firmware from being built"
注:每一個菜單項必須有類型屬性。
2.3.2 默認值
默認值屬性default一般在類型屬性後邊,如:
- config UEVENT_HELPER_PATH
- string "path to uevent helper"
- default "/sbin/hotplug"
表示當前菜單項若用戶沒有選擇或輸入任何值時,所取的默認值.上述所示為當前的默認值為"/sbin/totplug".
2.3.3 依賴
依賴可以是"depends on"或"requires".
語法:
- depends on/requires <expr>
<expre>為表達式,可為之前定義的菜單項名.
如:
- depends on HOTPLUG
表示此菜單項顯示與否取決於另外一個菜單項HOTPLUG ,只有當菜單項HOTPLUG這個菜單項有效顯示,當前菜單項才會顯示。
例如:
- config MODULES
- bool "Enable loadable module support"
-
- config MODVERSIONS
- bool "Set version information on all module symbols"
- depends on MODULES
-
- comment "module support disabled"
- depends on !MODULES
菜單項MODVERSIONS的顯示與否取決於菜單項MODULES。這種信賴關系常用在子菜單項中。
2.3.4 選擇
語法:
- choice
-
- 選擇項
-
- ..
-
- endchoice
2.3.5 提示
語法:
- comment "提示信息字符串"
- comment選項
comment只是用來給用戶提示信息的,後跟字符串,此字符串也可以在終端中顯示。
comment選項只可以是deponds on。