關(guān)于Linux 內(nèi)核配置系統(tǒng)淺析
前面說過,每個(gè)配置變量取值范圍是:y,n,m 和空,obj-$(CONFIG_TC) 分別對應(yīng)著 obj-y,obj-n,obj-m,obj-。如果 CONFIG_TC 配置為 y,那么 tc.o 就進(jìn)入了 obj-y 列表。obj-y 為包含到 Linux 內(nèi)核 vmlinux 中的目標(biāo)文件列表;obj-m 為編譯成模塊的目標(biāo)文件列表;obj-n 和 obj- 中的文件列表被忽略。配置系統(tǒng)就根據(jù)這些列表的屬性進(jìn)行編譯和鏈接。
export-objs 中的目標(biāo)文件都使用了 EXPORT_SYMBOL() 定義了公共的符號(hào),以便可裝載模塊使用。在 tc.c 文件的最后部分,有 EXPORT_SYMBOL(search_tc_card);,表明 tc.o 有符號(hào)輸出。
這里需要指出的是,對于編譯目標(biāo)的定義,存在著兩種格式,分別是老式定義和新式定義。老式定義就是前面 Rules.make 使用的那些變量,新式定義就是 obj-y,obj-m,obj-n 和 obj-。Linux 內(nèi)核推薦使用新式定義,不過由于 Rules.make 不理解新式定義,需要在 Makefile 中的適配段將其轉(zhuǎn)換成老式定義。
c) 適配段
適配段的作用是將新式定義轉(zhuǎn)換成老式定義。在上面的例子中,適配段就是將 obj-y 和 obj-m 轉(zhuǎn)換成 Rules.make 能夠理解的 L_TARGET,L_OBJS,LX_OBJS,M_OBJS,MX_OBJS。
L_OBJS := $(sort $(filter-out $(export-objs), $(obj-y))) 定義了 L_OBJS 的生成方式:在 obj-y 的列表中過濾掉 export-objs(tc.o),然后排序并去除重復(fù)的文件名。這里使用到了 GNU Make 的一些特殊功能,具體的含義可參考 Make 的文檔(info make)。
d) include $(TOPDIR)/Rules.make
3. 配置文件
3.1 配置功能概述
除了 Makefile 的編寫,另外一個(gè)重要的工作就是把新功能加入到 Linux 的配置選項(xiàng)中,提供此項(xiàng)功能的說明,讓用戶有機(jī)會(huì)選擇此項(xiàng)功能。所有的這些都需要在 config.in 文件中用配置語言來編寫配置腳本,
在 Linux 內(nèi)核中,配置命令有多種方式:
配置命令 解釋腳本
Make config, make oldconfig scripts/Configure
Make menuconfig scripts/Menuconfig
Make xconfig scripts/tkparse
以字符界面配置(make config)為例,頂層 Makefile 調(diào)用 scripts/Configure, 按照 arch/arm/config.in 來進(jìn)行配置。命令執(zhí)行完后產(chǎn)生文件 .config,其中保存著配置信息。下一次再做 make config 將產(chǎn)生新的 .config 文件,原 .config 被改名為 .config.old
3.2 配置語言
1) 頂層菜單
mainmenu_name /prompt/ /prompt/ 是用'或包圍的字符串,'與的區(qū)別是'…'中可使用$引用變量的值。mainmenu_nAME 設(shè)置最高層菜單的名字,它只在 make xconfig 時(shí)才會(huì)顯示。
2) 詢問語句
bool /prompt/ /symbol/
hex /prompt/ /symbol/ /word/
int /prompt/ /symbol/ /word/
string /prompt/ /symbol/ /word/
tristate /prompt/ /symbol/
詢問語句首先顯示一串提示符 /prompt/,等待用戶輸入,并把輸入的結(jié)果賦給 /symbol/ 所代表的配置變量。不同的詢問語句的區(qū)別在于它們接受的輸入數(shù)據(jù)類型不同,比如 bool 接受布爾類型( y 或 n ),hex 接受 16 進(jìn)制數(shù)據(jù)。有些詢問語句還有第三個(gè)參數(shù) /word/,用來給出缺省值。
3) 定義語句
define_bool /symbol/ /word/
define_hex /symbol/ /word/
define_int /symbol/ /word/
define_string /symbol/ /word/
define_tristate /symbol/ /word/
不同于詢問語句等待用戶輸入,定義語句顯式的給配置變量 /symbol/ 賦值 /word/。
4) 依賴語句
dep_bool /prompt/ /symbol/ /dep/ ...
dep_mbool /prompt/ /symbol/ /dep/ ...
dep_hex /prompt/ /symbol/ /word/ /dep/ ...
dep_int /prompt/ /symbol/ /word/ /dep/ ...
dep_string /prompt/ /symbol/ /word/ /dep/ ...
dep_tristate /prompt/ /symbol/ /dep/ ...
與詢問語句類似,依賴語句也是定義新的配置變量。不同的是,配置變量/symbol/的取值范圍將依賴于配置變量列表/dep/ …。這就意味著:被定義的配置變量所對應(yīng)功能的取舍取決于依賴列表所對應(yīng)功能的選擇。以dep_bool為例,如果/dep/ …列表的所有配置變量都取值y,則顯示/prompt/,用戶可輸入任意的值給配置變量/symbol/,但是只要有一個(gè)配置變量的取值為n,則/symbol/被強(qiáng)制成n。
不同依賴語句的區(qū)別在于它們由依賴條件所產(chǎn)生的取值范圍不同。
5) 選擇語句
choice /prompt/ /word/ /word/
choice 語句首先給出一串選擇列表,供用戶選擇其中一種。比如 Linux for ARM 支持多種基于 ARM core 的 CPU,Linux 使用 choice 語句提供一個(gè) CPU 列表,供用戶選擇:
choice 'ARM system type'
Anakin CONFIG_ARCH_ANAKIN
Archimedes/A5000 CONFIG_ARCH_ARCA5K
Cirrus-CL-PS7500FE CONFIG_ARCH_CLPS7500
……
SA1100-based CONFIG_ARCH_SA1100
Shark CONFIG_ARCH_SHARK RiscPC
Choice 首先顯示 /prompt/,然后將 /word/ 分解成前后兩個(gè)部分,前部分為對應(yīng)選擇的提示符,后部分是對應(yīng)選擇的配置變量。用戶選擇的配置變量為 y,其余的都為 n。
6) if語句
if [ /expr/ ] then
/statement/
...
fi
if [ /expr/ ] then
/statement/
...
else
/statement/
...
fi
if 語句對配置變量(或配置變量的組合)進(jìn)行判斷,并作出不同的處理。判斷條件 /expr/ 可以是單個(gè)配置變量或字符串,也可以是帶操作符的表達(dá)式。操作符有:=,!=,-o,-a 等。
7) 菜單塊(menu block)語句
mainmenu_option next_comment
comment '…..'
…
endmenu
引入新的菜單。在向內(nèi)核增加新的功能后,需要相應(yīng)的增加新的菜單,并在新菜單下給出此項(xiàng)功能的配置選項(xiàng)。Comment 后帶的注釋就是新菜單的名稱。所有歸屬于此菜單的配置選項(xiàng)語句都寫在 comment 和 endmenu 之間。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論