【Linux學習小技巧】Linux內核開發(fā)工具介紹2
通過make menuconfig(make xconfig或者make gconfig)命令配置內核的時候,從Kconfig文件讀取菜單,配置完畢保存到文件名為.config的內核配置文件中,供Makefile文件在編譯內核時使用。
1.1.1 Kconfig基本語法
程序清單1drivers/char/Kconfig片段
menu "Character devices"
source "drivers/tty/Kconfig"
config DEVKMEM
bool "/dev/kmem virtual device support"
default y
help
Say Y here if you want to suppor
1. 子菜單
子菜單的菜單項則由config來定義,隨后的“bool”、“default”、“help”等都是該菜單項的屬性:
config DEVKMEM
bool "/dev/kmem virtual device support"
這兩行語句定義了一個bool選項,在.config中的配置變量名稱為CONFIG_DEVKMEM,選項提示信息為“/dev/kmem virtual device support”,在內核配置界面的實際表現(xiàn)為:
[*] /dev/kmem virtual device support
由于設置其默認屬性default為y,所以該選項默認選中。
help引出幫助信息,在內核配置界面,選擇選項后,通過
2. 屬性
類型定義:每個菜單項都必須定義類型,可選類型有:bool、tristate、string、hex和int,各類型描述如表1所列。
表1菜單項類型和說明
定義選項的類型后面可以加菜單信息,用引號(“”)給出,留空則不加提示信息。
對于布爾型選項,在配置界面用[]表示:
[*] /dev/kmem virtual device support
[*]表示選中,對應CONFIG_XXX=y,[ ]則表示未選中。
對于三態(tài)選項,在配置界面用<>表示:
<*> Kernel .config support
<*>表示選中,對應CONFIG_XXXx=y,
子菜單也可同時設置類型,如下列代碼在定義PWM菜單的同時定義了菜單屬性為三態(tài):
menuconfig GENERIC_PWM
tristate "PWM Support"
default n
help
Enables PWM device support implemented via a generic
framework.If unsure, say N.
在配置界面表現(xiàn)為:
<> PWM Support--->
說明:子菜單的配置值會影響其子選項的可能值。例如三態(tài)子菜單配置為
默認值:有寫選項可以設置默認值,無論是哪種類型,都可以通過default設置其默認值,例如:
config ARM
bool
default y
select HAVE_AOUT
選中:前面這個示例的select,表示了一種選中關系,即選中某個選項后,會自動選中某個或者某些選項。前面這個示例表明,選中Arm?后,會自動選中HAVE_AOUT。
依賴關系:如果一個選項能否生效與否與其它選項的設置有關,則必須通過depends on來聲明這種依賴關系。例如,只有使能了SMP才能設置CPU個數(shù)變量NR_CPUS,在Kconfig中則寫成:
config NR_CPUS
int "Maximum number of CPUs (2-32)"
range 2 32
depends on SMP
default "4"
幫助:通過help關鍵字引入幫助,幫助的正文必須另起一行。
菜單選項屬性的每個關鍵字,必須用TAB鍵與行首隔開,不能用等數(shù)的空格替代。
3. 目錄層次迭代
通過source可以直接引用下級目錄的Kconfig文件,形成新的菜單項或者子菜單,這樣方便每個目錄獨立管理各自的配置內容?!皊ource "drivers/tty/Kconfig"”就是直接引用
1.1.2 配置項和配置開關
通過config定義的菜單配置項,在內核配置后會產(chǎn)生一個以“CONFIG_”開頭的配置開關變量,該開關變量可在Makefile中或者源代碼中使用。
例如:“config BAR”將會產(chǎn)生一個開關變量CONFIG_BAR,在Makefile中可以這么使用:
obj-$(CONFIG_BAR)+= file_bar.o
在源代碼中可用這個開關變量在源代碼中可用這個開關變量來進行一些條件處理,例如:
#if defined (CONFIG_BAR)
實際處理代碼
#endif
如果定義的BAR是三態(tài)變量,則還可以根據(jù)需要這樣使用:
#if defined (CONFIG_BAR)|| defined (CONFIG_BAR_MODULE)
實際處理代碼
#endif