本文轉自https://www.veryarm.com/42482.html
menuconfig
menuconfig是一套圖像化配置工具,由ncurses庫提供軟件支持。ncurses庫提供了一系列的函數以便使用者調用它們去生成基於文本的用戶界面。
menuconfig本身的軟件只負責提供menuconfig工作的這一套邏輯,比如說通過上下左右調整光標,Enter選中等,並不負責提供內容。menuconfig運行之後會讀取Kconfig、讀取/寫入.config文件,Kconfig提供菜單項的內容,.config用來記錄菜單項的選擇值。
內核源碼目錄下make menuconfig就會進來,箭頭按鍵導航整個菜單,回車按鍵選擇子菜單(注意選項後面有 —>的選項纔是有子菜單的,沒有這個標識的沒有子菜單),高亮的字母是熱鍵(快捷鍵),鍵盤按鍵Y、N、M三個按鍵的作用分別是將選中模塊編入、去除、模塊化。雙擊ESC表示退出,按下?按鍵可以顯示幫助信息,按下/按鍵可以輸入搜索內容來全局搜索信息(類似於vi中的搜索),[ ]不可以模塊化,< >的纔可以模塊化。
注:linux內核中一個功能模塊有三種編譯方法:一種是編入、一種去去除、一種是模塊化。所謂編入就是將這個模塊的代碼直接編譯連接到zImage中去,去除就是將這個模塊不編譯鏈接到zImage中,模塊化是將這個模塊仍然編譯,但是不會將其鏈接到zImage中,會將這個模塊單獨鏈接成一個內核模塊.ko文件,將來linux系統內核啓動起來後可以動態的加載或卸載這個模塊。
在menuconfig中選項前面的括號裏,*表示編入,空白表示去除,M表示模塊化。
3.配置菜單界面啓動流程
執行make menuconfig的時候,會執行頂層目錄下的Makefile。
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
$(build)=scripts/kconfig,build是編譯規則,$(build)=scripts/kconfig
實質是:-f scripts/kconfig/Makefile
則:$(Q)$(MAKE) $(build)=scripts/kconfig $@ 等同於
make -f scripts/kconfig/Makefile menuconfig
-f:指定執行某個Makefile文件,表示到scripts/kconfig目錄下Makefile文件中,生成目標menuconfig。
Q的值根據KBUILD_VERBOSE的值來決定,Q=空時會打印命令信息,Q=@時隱藏命令信息
MAKE爲系統內置變量,可以參考這篇文章打印。
繪製圖形和解析這個界面的文件都會在scripts/kconfig目錄下面,比較重要的文件有mconf.c和lxdialog目錄。
接下來,scripts/kconfig/Makefile 找到目標所在的代碼:
menuconfig: $(obj)/mconf
$< $(Kconfig)
obj := $(CURDIR)
Kconfig := arch/$(SRCARCH)/Kconfig
SRCARCH := $(ARCH)
而變量在頂層目錄的Makefile中早已賦值arm,所以:
menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf arch/arm/Kconfig
當我們執行命令make menuconfig時,(1)先創建兩個二級目錄include /linux 和 include/config,(2)接着把scripts/kconfig/裏面的可執行文件mconf運行起來,有能力的話可以詳看scripts/kconfig/mconf.c,根據文件arch/arm/kconfig內容,顯示出一個菜單界面。其實,mconf運行起來,首先是“畫出”菜單界面(顯示內容則根據各級目錄的Kconfig文件),然後查看源碼頂層目錄有沒有存在.config文件,若沒有,則按照默認顯示到菜單裏面;若存在.config,則會把它讀出來存到內存某塊區域,在逐行逐行解析它的內容,再把讀出的內容更新到菜單。最後會保存在源碼頂層的.config文件中。
Kconfig文件語法
kconfig的總入口是arch/arm/kconfig,不是源碼頂層的kconfig,入口一定是根據某款平臺的。
1.tristate、bool、string
bool:[ ]有兩種狀態,*代表選中,空代表未選中;
tristate:< >有三種狀態,*代表選中,空代表未選中,M代表模塊;
string:( )存放十進制或者十六進制字符串;
2.mainmenu
如果配置程序選擇了使用它,那麼就用它配置程序的標題欄。
mainmenu "Linux Kernel Configuration"
config ARM
bool
default y
select HAVE_AOUT
select HAVE_IDE
3.config
開啓一個新的配置選項入口,下面的行定義了配置選項的屬性,屬性可以是配置輸入提示、依賴、幫助文檔和默認值等,一個配置選項可以被多次定義,但是每一次定義只有單一的輸入提示,並且類型不能衝突。
config MODVERSIONS
bool "Set version information on all module symbols"
depends on MODULES
help
Usually, modules have to be recompiled whenever you
switch to a newkernel. ...
4.prompt
輸入提示作用,下面兩種方式,效果相同。
bool "Networking support"
and
bool
prompt "Networking support"
5.depends on、select
depends on 表示此選項會依賴其它選項的配置,也就是BAR被選擇之後,該選項才能被選擇;select 表示反向依賴,如果當前項選中,那麼也選中select後的選項。
6.default
用於設定默認值,y表示該選項默認被選擇上。
bool "foo" if BAR
default y if BAR
and
depends on BAR
bool "foo"
default y
7.menu
定義一個菜單入口, 表示Network device support是一個菜單選項。
menu "Network device support"
depends on NET
config NETDEVICES
...
endmenu
8.source
將另外一個Kconfig文件直接複製到當前位置,可以將這個系統貫穿在一起。從開始位置arch/arm/Kconfig,來將整個系統都作爲配置型。
config ARM_L1_CACHE_SHIFT_6
bool
help
Setting ARM L1 cache line size to 64 Bytes.
source "init/Kconfig"
9.help
幫助信息,告訴我們這個配置項的含義,以及如何去配置他。
.config
“.config文件中每一行都是一個配置項,從.config文件的規模可以看出linux內核的可配置項有兩三千個。所以linux內核是高度可配置的,而且linux內核的所有配置項很難全部搞明白。因爲linux內核的配置項太多太繁雜超出了人的大腦能夠記憶和處理的數量級,因此linux內核不像uboot那樣直接手工配置,而是發明了一個圖形化的配置工具menuconfig。”
menuconfig的終極目標就是讓我們更容易地配置.config文件。一般廠商會提供他們配置好的.config文件,裏面配置好了大部分的必要功能,如果我們自己需要修改,那麼就可以通過menuconfig來修改配置。
(1)menuconfig中config後面空格隔開的大寫字母表示的類似於 NETDEVICES 的就是這個配置項的配置項名字,這個字符串前面添加 CONFIG_ 後就構成了.config中的配置項名字。
(2)這個.config中的配置值(=y、=m、=n)會影響最終的編譯鏈接過程。如果=y則會被編入(built-in),如果=m會被單獨連接成一個ko模塊,如果=n則對應的代碼不會被編譯,這些都是通過makefile實現的。
(3).config中的配置值指導整個編譯連接過程。