內核配置和編譯
一. 相關重要文件
1.1. Kconfig
1.1.1. 什麽是kconfig文件
a. Kconfig文件分布在各目錄下構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單(描述了Menuconfig的內容)
1.1.2. Kconfig的格式
1.1.2.1. Kconfig按照一定的格式來書寫,menuconfig程序可以識別這種格式,然後從中提取出有效信息組成menuconfig中的菜單項。
1.1.2.2. 將來在做驅動移植等工作時,有時需要自己添加Kconfig中的一個配置項來將某個設備驅動添加到內核的配置項目中,這時候就需要對Kconfig的配置項格式有所了解,否則就不會添加。
1.1.2.3. #開頭的行是註釋行
1.1.2.4. menuconfig表示菜單(本身屬於一個菜單中的項目,但是他又有子菜單項目)、config表示菜單中的一個配置項(本身並沒有子菜單下的項目)。
1.1.2.5. menuconfig或者config後面空格隔開的大寫字母表示的類似於 NETDEVICES 的就是這個配置項的配置項名字,這個字符串前面添加CONFIG_後就構成了.config中的配置項名字。
1.1.2.6. 一個menuconfig後面跟著的所有config項就是這個menuconfig的子菜單。這就是Kconfig中表示的目錄關系。
1.1.2.7. 內核源碼目錄樹中每一個Kconfig都會source引入其所有子目錄下的Kconfig,從而保證了所有的Kconfig項目都被包含進menuconfig中。這個也告訴我們:如果你自己在linux內核中添加了一個文件夾,一定要在這個文件夾下創建一個Kconfig文件,然後在這個文件夾的上一層目錄的Kconfig中source引入這個文件夾下的Kconfig文件。
1.1.2.8. tristate和bool的含義
a. tristate意思是三態(3種狀態,對應Y、N、M三種選擇方式),
b. bool是要麽真要麽假(對應Y和N)
1.1.2.9. depends的含義
a. depends中文意思是“取決於”或者“依賴於”,所以depends在這裏的意思是:本配置項依賴於另一個配置項。如果那個依賴的配置項為Y或者M,則本配置項才有意義;如果依賴的哪個配置項本身被設置為N,則本配置項根本沒有意義。
b. depends項目會導致make menuconfig的時候找不到一些配置項。所以你在menuconfig中如果找不到一個選項,但是這個選項在Kconfig中卻是有的,則可能的原因就是這個配置項依賴的一個配置項是不成立的。
c. depends並不要求依賴的配置項一定是一個,可以是多個,而且還可以有邏輯運算。這種時候只要依賴項目運算式子的裸機結果為真則依賴就成立。
1.1.2.10. select:表示depends on的值有效時,下面的select也會成立,將相應的內容選上。
1.1.2.11.default:表示depends on的值有效時,下面的default也會成立,將相應的選項選上,有三種選項,分別對應y,n,m。
1.1.2.12. help: 幫助信息,告訴我們這個配置項的含義,以及如何去配置他。
1.2. .config
1.2.1. 什麽是.config
a. .config以.開頭,是一個隱藏文件,因此平時是看不到的,需要ls -a來看
b. 當我們make distclean後(也就是說默認情況下)是沒有.config文件的,我們配置的兩步過程就是為了得到內容合適的.config文件
c. .config文件是linux內核在編譯過程中很重要的一個文件,其作用類似與uboot中的include/configs/x210_sd.h,內核在編譯過程中會讀取.config中的配置項,並且用這些配置項去指導整個編譯鏈接過程。
d. .config文件的格式類似於腳本文件,其中內容為類似於於:CONFIG_ARM=y的一個一個的配置項。這些配置項就類似於腳本文件中定義的一個一個變量,所以這一行可以被理解為定義了一個變量CONFIG_ARM,這個變量的值為y。
e. .config文件中每一行都是一個配置項,從.config文件的規模可以看出linux內核的可配置項有兩三千個。所以linux內核是高度可配置的,而且linux內核的所有配置項很難全部搞明白。因為linux內核的配置項太多太繁雜超出了人的大腦能夠記憶和處理的數量級,因此linux內核不像uboot那樣直接手工配置,而是發明了一個圖形化的配置工具menuconfig。
1.3. Makefile
a. 關於Makefile見之前博客簡介,linux中Makefile和uboot作用相識,也是用於指導編譯,鏈接
二. 配置流程
2.1. make distclean
a. make distclean要清除之前所有生成的文件,主要是清除.config。
2.2. make xxx_defconfig
2.2.1. make xxx_defconfig作用
a. make x210ii_qt_defconfig其實相當於:cp arch/arm/configs/x210ii_qt_defconfig .config
b. arch/arm/configs目錄下的這麽多個xxx_defconfig哪裏來的?其實這些文件都是別人手工配置好適合一定的開發板的.config文件後自己把.config文件保存過去的。譬如說我們用S5PV210這個SoC,針對這個SoC的開發板的最初配置肯定是三星的工程師去做的。
2.3. make menuconfig
2.3.1. make menuconfig原理
2.3.1.1. menuconfig本身由一套軟件支持
a. linux為了實現圖形化界面的配置,專門提供了一套配置工具menuconfig。
b. ncurses庫是linux中用來實現文字式的圖形界面,linux內核中使用了ncurses庫來提供menuconfig
c. scripts\kconfig\lxdialog目錄下的一些c文件就是用來提供menuconfig的那些程序源代碼。
2.3.2. menuconfig內容來源
2.3.2.1. menuconfig讀取Kconfig文件獲取具體內容
a. menuconfig本身的軟件只負責提供menuconfig工作的這一套邏輯(譬如在menuconfig中通過上下左右箭頭按鍵來調整光標,Enter ESC鍵等按鍵按下的響應),而並不負責提供內容(菜單裏的項目)。
b. menuconfig顯示的菜單內容(一方面是菜單的目錄結構,另一方面是每一個菜單項目的細節)是由內核源碼樹各個目錄下的Kconfig文件來支持的。Kconfig文件中按照一定的格式包含了一個又一個的配置項,每一個配置項在make menuconfig中都會成為一個菜單項目。而且menuconfig中顯示的菜單目錄結構和源碼目錄中的Kconfig的目錄結構是一樣的。
2.3.3. menuconfig進行內容配置
a. menuconfig的菜單內容來自於Kconfig文件,但是每一個菜單的選擇結果(Y、N、M)卻不是保存在Kconfig文件中的。Kconfig文件是不變的,Kconfig文件只是決定有沒有這個菜單項,並不管這個菜單項的選擇結果。
b. menuconfig工作時在我們make menuconfig打開時,他會讀取.config文件,並且用.config文件中的配置選擇結果來初始化menuconfig中各個菜單項的選擇值。
c. 當我們配置完menuconfig並保存,則會將我們更改過的配置重新寫入.config文件中記錄,下一次再次打開make menuconfig時會再次加載.config,最終去編譯內核時編譯連接程序會考慮.config中的配置值指導整個編譯連接過程。
三. 總結
3.1. menuconfig和.config的關系
a. make menuconfig時,會讀取.config中的配置值來初始化menuconfig中的配置項。
b. menuconfig中修改了(按Y、N、M)配置項的值,然後退出時保存,則這個保存結果會修改.config文件中的相應行。
3.2. menuconfig和Kconfig的關系
a. menuconfig讀取Kconfig的內容作為菜單項目內容。
3.3. 驗證驗證menuconfig和Makefile的關系
a. Makefile裏面的條件編譯是由.config中的宏決定的,而.config中的宏是否被註釋又是有make menuconfig中選擇決定的,而make menuconfig中的是否存在這個配置選項則是由Kconfig決定的,由此串聯起來了四者的關系
參考《朱老師.2.15.內核的配置和編譯原理》
內核配置和編譯