Linux內核移植之二:Kconfig分析

內容來自 韋東山《嵌入式Linux應用開發完全手冊》

 

        在內核日錄下執行“make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-”時,就會看到一個如圖16.3所示的菜單,這就是內核的配置界面。通過配置界面,可以選擇芯片類型、選擇需要支持的文件系統,去除不需要的選項等,這就稱爲“配置內核”。注意,也有其他形式的配置界面,比如“make config”命令啓動字符配置界面,對於每個選項都會依次出現一行提示信息,逐個回答;“make xconfig”命令啓動X-windows圖形配置界面。

        所有配置工具都是通過讀取arch/$(ARCH)/Kconfig文件來生成配置界面,這個文件是所有配置文件的總入口,它會包含其他目錄的Kconfig文件。配置界面如圖16.3所示。

        內核源碼每個子日錄中,都有一個Makefile文件和Kconfig文件。Makefile的作用前面已經講述,Kconfig用於配置內核,它就是各種配置界面的源文件。內核的配置工具讀取各個Kconfig文件,生成配置界面供開發人員配置內核,最後生成配置文件.config。

        內核的配置界面以樹狀的菜單形式組織,主菜單下有若干個子菜單,子菜單下又有子菜單或配置選項。每個子菜單或選項可以有依賴關係,這些依賴關係用來確定它們是否顯示。只有被依賴項的父項已經被選中,子項纔會顯示。

        Kconfig文件的語法可以參考Documentation/kbuild/kconfig-language.txt文件,下面講述幾個常用的語法,並在最後介紹菜單形式的配置界面操作方法。

1.Kconfig文件的基本要素:config條目(entry)

        config條目常被其他條目包含,用來生成菜單、進行多項選擇等。

        config條目用來配置一個選項,或者這麼說,它用於生成一個變量,這個變量會連同它的值一起被寫入配置文件.config中。比如有一個config 條目用來配置CONFIG_LEDS_S3C24XX,根據用戶的選擇,.config文件中可能出現下面3種配置結果中的一個。

CONFTG_LEDS_S3C24XX=y  #對應的文件被編進內核
CONEIG_LEDS_S3C24XX=m  #對應的文件被編成模塊
#CONFIG_LEDS_S3C24xx   #對應的文件沒有被使用

        以一個例子說明config條目格式,下面代碼選自fs/Kconfig文件,它用於配置CONFIG JFFS2FS POSIX_ACL選項。

1255 config JFFS2_FS_POSIX_ACL
1256 bool"JFFS2 POSIX Access Control Lists"
1257 depends on JFFS2_FS_XATTR
1258 default y
1259 select FS_POSTX_ACL
1260 help
1261 posix Access Control Lists(ACLs)support permissions for users and
1262 groups beyond the owner/group/world scheme.
1263
1264 To learn more about Access Control Lists,visit the Posix ACLs for
1265 Linux website <http://acl,bestbits.at/>.
1266
1267 If you don't know what Access Control Lists are,say N
1268

        代碼中包含了幾乎所有的元素,下面一一說明。

        第1255行中,config是關鍵字,表示一個配置選項的開始:緊跟着的JFFS2_FS POSIXACL是配置選項的名稱,省略了前綴“CONFIG_”。

        第1256行中,boot表示變量類型,即CONFIG_JFFS2_FS_POSIX_ACL的類型。有5種類型:bool、tristate、string、hex和int,其中的tristate和string是基本的類型,其他類型是它們的變種。boot變量取值有兩種:y和n;tristate變量取值有3種:y、n和m;string變量取值爲字符串:hex變量取值爲十六進制的數據;int變量取值爲十進制的數據。

     “boot”之後的字符串是提示信息,在配置界面中上下移動光標選中它時,就可以通過按空格或回車鍵來設置CONFIGJFFS2_FSPOSIXACL的值。提示信息的完整格式如下,如果使用“if <expr>”,則當expr爲真時才顯示提示信息。在實際使用時,prompt 關鍵字可以省略。

"prompt"<prompt>["if"<expr>]

        第1257行表示依賴關係,格式如下。只有JFFS2_FSXATTR配置選項被選中時,當前配置選項的提示信息纔會出現,才能設置當前配置選項。注意,如果依賴條件不滿足,則它取默認值。

"depends on"/"requires"<expr>

        第1258行的表示默認值爲y,格式如下:

"default"<expr>["if"<expr>]

        第1259行表示當前配置選項FFS2FSPOSIX_ACL被選中時,配置選項FS_POSIXACL也會被自動選中,格式如下:

"select"<symbo1>["if"<expr>]

        第1260行表示下面幾行是幫助信息,幫助信息的關鍵字有如下兩種,它們完全一樣。當遇到一行的縮進距離比第一行幫助信息的縮進距離小時,表示幫助信息已經結束。比如第1268行的縮進距離比第126的縮進距離小,幫助信息到第1267行結束。

“help"or"---help---"

        注意除第1255行的關鍵字及配置選項的名稱、第256行的變量類型外,其他信息都是可以省略的。

2.menu條目

        menu條目用於生成菜單,格式如下:

"menu"<prompt>
<menu options>
<menu block>
"endmenu"

        它的實際使用並不如它的標準格式那樣複雜,下面是一個例子。

menu"Floating point emulation"
config FPE_NWFPE 
...
config FPE_NWEPE_XP 
...
endmenu 

        menu之後的字符串是菜單名,“menu”和“endmenu”之間有很多config條目。在配置界面上會出現如下字樣的菜單,移動光標選中它後按回車鍵進入,就會看到這些config條目定義的配置選項。

Floating point emulation--->

 

3.choice條目

         choice條目將多個類似的配置選項組合在一起,供用戶單選或多選,格式如下:

"choice"
<choice options>
<choice block>
"endchoice"

         實際使用中,也是在“choice”和“endchoice”之間定義多個config條目,比如arch/arm/Kconfig中有如下代碼:

choice 
    prompt"ARM system type"
    default ARCH_VERSATILE 
config ARCH_AAEC2000
...
config ARCH_INTEGRATOR 
...
endchoice 

        prompt"ARM system type”給出提示信息“ARM system type”,光標選中它後按回車鍵進入,就可以看到多個config條日定義的配置選項。

        choice條目中定義的變量類型只能有兩種:bool和ristate,不能同時有這兩種類型的變量。對於bool類型的choice條日,只能在多個選項中選擇一個:對於tristate類型的choice條目,要麼就把多個(可以是一個)選項都設爲m;要麼就像bool類型的choice條目一樣,只能選擇一個。這是可以理解的,比如對於同一個硬件,它有多個驅動程序,可以選擇將其中之一編譯進內核中(配置選項設爲y),或者把它們都編譯爲模塊(配置選項設爲m)。

4.comment條目

        comment條目用於定義一些幫助信息,它在配置過程中出現在界面的第一行;並且這些幫助信息會出現在配置文件中(作爲註釋),格式如下:

"comment"<prompt>
<comment options>

        實際使用中也很簡單,比如arch/arm/Kconfig中有如下代碼:

menu"Floating point emulation"
comment"At least one emulation must be selected"
...

        進入菜單“Floating point emulation-->”之後,在第一行會看到如下內容:

-—-At least one emulation must be selected

        而在.config文件中也會看到如下內容:

#At least one emulation must be selected

5.source條目

        source條目用於讀入另一個Kconfig文件,格式如下:

"source" <prompt>

        下面是一個例子,取自arch/arm/Kconfig文件,它讀入net/Kconfig文件。

source "net/Kconfig"

6.菜單形式的配置界面操作方法

        配置界面的開始幾行就是它的操作方法,如圖16.4所示。

        內核scripts/kconfig/mconfc文件的註釋給出了更詳細的操作方法,講解如下。

        一些特定功能的文件可以直接編譯進內核中,或者編譯成一個可加載模塊,或者根本不使用它們。還有一些內核參數,必須給它們賦一個值:十進制數、十六進制數,或者一個字符串。配置界面中,以[*]、<M>或[]開頭的選項表示相應功能的文件被編譯進內核中、被編譯成一個模塊,或者沒有使用。尖括號~表示相應功能的文件可以被編譯成模塊。

        要修改配置選項,先使用方向鍵高亮選中它,按<Y>鍵選擇將它編譯進內核,按<M>鍵選擇將它編譯成模塊,按-N>鍵將不使用它。也可以按空格鍵進行循環選擇,例如:Y-N-M一Y。

        上/下方向鍵用來高亮選中某個配置選項,如果要進入某個子菜單,先選中它,然後按回車鍵進入。配置選項的名字後有“>”表示它是一個子菜單。配置選項的名稱中有一個高亮的字母,它被稱爲“熱鍵”(hotkey),直接輸入熱鍵就可以選中該配置選項,或者循環選中具有相同熱鍵的配置選項。

        可以使用翻頁鍵<PAGE UP>和<PAGE DOWN>來移動配置界面中的內容。要退出配置界面,使用左/右方向鍵選中<Exi心按鈕,然後按回車鍵。如果沒有配置選項使用後面這些按鍵作爲熱鍵的話,也可以按兩次<ESC>鍵或<E><X>鍵退出。

        按<TAB>鍵可以在<Select>、<Exit>和<Help>這3個按鈕中循環選中它們。

         要想閱讀某個配置選項的幫助信息,選中它之後,再選中<Help>按鈕,按回車鍵;也可以選中配置選項後,直接按<H>或<2>鍵。

        對於choise條目中的多個配置選項,使用方向鍵高亮選中某個配置選項,按<S>或空格鍵選中它:也可以通過輸入配置選項的首字母,然後按<S>或空格鍵選中它。

        對於int、hex或string類型的配置選項,要輸入它們的值時,先高亮選中它,按回車鍵,輸入數據,再按回車鍵。對於十六進制數據,前綴0x可以省略。

        配置界面的最下面,有如下兩行:

Load an Alternate Configuration File
Save an Alternate Configuration File

        前者用於加載某個配置文件,後者用於將當前的配置保存到某個配置文件中去。需要注意的是,如果不使用這兩個選項,配置的加載文件、輸出文件都默認爲.config文件;如果加載了其他的文件(假設文件名爲A),然後在它的基礎上進行修改,最後退出保存時,這些變動會保存到A中去,而不是.config。

        當然,可以先加載(Load an Alternate Configuration File)文件A,然後修改,最後保存(Save an Alternate Configuration File)到.config中去。

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