1、核心的配置體系
核心是高度可裁剪的,開發産品時根據産品的需求将無用的子產品裁剪掉,也就是不要編譯進核心,這樣編譯出來的核心體積小,節省記憶體,還可以節省性能。由此就需要條件編譯,但是核心的可選編譯子產品太多了,必須要用一套編譯體系來管理。我們可以這樣類比來了解為什麼核心需要一套編譯體系來進行配置:當工程隻有一個a.c,我們可以直接"gcc a.c"進行編譯,但是有1000個源檔案,用這種方法就不可行了,于是我們用Makefile進行編譯;Makefile可以通過條件編譯來讓同一份代碼在不同的平台上運作,假設代碼編譯的條件隻用選兩個平台(arm和下x86),我們可以"make plat=arm"或者"make plat=x86",那如果要條件編譯的選項有上千個,同樣的這樣手工選擇的方法也不可行,于是發明了一套編譯體系來實作條件編譯。總結:工程要管理的源檔案太多,發明了Makefile;核心的Makefile要實作的條件編譯太多,發明了一套編譯體系;核心的配置體系由:Makefile、menuconfig、.config三部分構成。
2、核心配置和編譯步驟
(1)确認Makefile:确認ARCH變量,比如ARCH=arm,表示編譯ARM平台的核心,這個根據你用的soc選擇;檢查交叉編譯工具鍊有沒有設定對。如:CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
(2)make xxxx_defconfig:執行該語句後出現:configuration written to .config這句話就成功了。xxxx_defconfig是配置檔案,指導編譯核心,根據自己的硬體平台去選擇,這句指令的作用就是生成.config檔案,相當于"cp arch/xxx/configs/xxx_defconfig ./config",xxxx_defconfig是放在arch/平台名/configs下的。
(3)make menuconfig:會出現圖形化的界面,可以在此界面配置核心,加載或者去除掉某些子產品。
執行menuconfig可能出錯的原因:螢幕太小,顯示不了。解決方法就是全屏或者把字型調小;ncurses庫沒裝,會有相關報錯資訊;
3、".config"檔案
.config檔案是一個隐藏檔案,要用"ls -a"才能看見,預設是沒有這個檔案的,需要執行配置指令(make xxxx_defconfig)後才會生成。.config檔案最初就是由xxxx_defconfig檔案複制得來,裡面全是配置項,以行為機關。每個配置項的格式都是CONFIG_xxx=x,每個配置項都可以在menuconfig中找到。CONFIG_xxx是配置項的名字,該配置項在menuconfig中的名字就是xxx,等号後面是配置的結果,可以是Y、N、M,Y代表編譯連接配接此子產品,N代表不編譯此子產品,M代表将該子產品單獨編譯成.ko檔案。
總結:.config檔案最初由xxxx_defconfig檔案複制得來,然後可以在menuconfig中做修改,最終Makefile會讀取.config檔案,裡面的每個配置項都會指導核心的編譯。
4、menuconfig詳解
參考部落格《Linux核心配置——menuconfig》。
5、Kconfig檔案
參考部落格《Linux核心配置——Kconfig檔案》。
6、menuconfig、Makefile、.config三者之間的關系
6.1、Kconfig檔案内容
config DM9000
tristate "DM9000 support"
depends on ARM || BLACKFIN || MIPS
default y
select CRC32
select MII
---help---
Support for DM9000 chipset.
To compile this driver as a module, choose M here. The module
will be called dm9000.
6.2、.config檔案

6.3、對應在menuconfig中
6.4、檔案之間關系的解讀
通過以網卡晶片DM9000的配置為例,講解幾個檔案之間的聯系。
(1).config檔案預設在核心源碼中是沒有的,要先執行"make xxxx_defconfig"生成.config檔案,這是對核心的初步配置。其中DM9000對應的名字是CONFIG_DM9000,等号後面的對DM9000的配置選項;
(2)執行"make menuconfig",在menuconfig會讀取.config和Kconfig,在menuconfig中可以找到DM9000配置項,可以再次選擇;
(3)Kconfig中DM900的内容是.config和menuconfig内容的來源,仔細對比DM9000在三個檔案中的名字,可以發現關聯;
(4)關閉menuconfig後,會把改變過的選項寫會到.config中;
(5)Makefile中,會去.config中讀取每項配置,其中就包括CONFIG_DM9000,如果CONFIG_DM9000=y則将編譯進核心,如果CONFIG_DM9000=n則不會編譯,如果CONFIG_DM9000=m則單獨編譯成.ko檔案;