有許多Linux內核源文件。
我不了解Makefile,Kconfig和.config之間的關系。
我不了解內核編譯系統。
如果在編譯和修改內核時遇到問題,我將無法開始。
我不知道如何編譯寫入內核的驅動程序或如何配置內核。
這些問題都與Makefile,Kconfig和.config有關。
讓我們簡要地談一下Makefile,Kconfig和.config。
希望能激發您的靈感。
三個角色:簡單地說,去餐廳點餐:Kconfig是菜單,Makefile是練習,.config是您點的食物。
Makefile:文本文件,一種編譯源文件的方法。
Kconfig:一個文本文件,內核的配置菜單。
.config:編譯內核所基于的配置。
三個Makefile引用的語法:linux-3.4.2 / drivers / Makefile功能:用于定義將哪些內容編譯為模塊,執行哪些條件編譯等。
子目錄Makefile包含在頂部的Makefile中。
(1)直接編譯obj-y + = xxx.o表示xxx.o由xxx.c或xxx.s編譯并直接編譯到內核中。
(2)條件編譯obj-$(CONFIG_HELLO)+ = xxx.o確定是否根據.config文件的CONFIG_XXX將文件編譯到內核中。
(3)模塊編譯obj-m + = xxx.o表示xxx被編譯為模塊,即在執行make模塊時將其編譯。
2. Kconfig每個config菜單項都有類型定義:布爾類型,三態(內置,模塊,已刪除),字符串字符串,十六進制十六進制,整數整數。
功能:確定在進行menuconfig時顯示的菜單項,請參閱:linux-3.4.2 / drivers / leds / kconfig:config LEDS_S3C24XX三態“ Samsung S3C24XX GPIO LED的LED支持”。
取決于LEDS_CLASS是否啟用對LED的支持該ARCH_S3C24取決于與Samsung S3C24XX系列CPU(例如S3C2410和S3C2440)上的GPIO線連接的ARCH_S3C24。
LEDS_S3C24XX:配置選項的名稱,前綴“ CONFIG_”。
被省略。
Tristate:指示該項目是被編程到內核還是模塊中。
顯示為:如果選擇編譯為內核模塊,則將在.config中生成CONFIG_HELLO_MODULE = m的配置,如果選擇Y,則將其直接編譯到內核中,并使用CONFIG_HELLO_MODULE =的配置項y將在.config中生成。
Tristate之后的字符串是在make menuconfig期間顯示的配置項目的名稱。
布爾:只能選擇或不選擇此類型。
它在make menuconfig中顯示為[],這意味著它不能配置為模塊。
取決于:此選項取決于另一個選項。
僅選擇從屬項時,將出現在當前配置項目的提示消息,并將當前配置項可以被設置。
選擇:反向依賴性。
選擇此選項時,將同時選擇在選擇之后定義的項目。
help:幫助信息。
目錄層次結構迭代:Kconfig中有一個類似的語句:源“ drivers / usb / Kconfig”,用于包含(或嵌套)新的Kconfig文件,因此每個目錄都可以管理其自己的配置內容,因此沒有必要將這些配置寫入同一文件中,可以方便地進行修改和管理。
3. .config參考:linux-3.4.2 / .config通過分析前兩個文件,.config的含義很明確:內核編譯參考文件,檢查其中的內容以了解哪些驅動程序被編譯到內核中。
有3種配置內核的方法(選擇一種):(1)make menuconfig(2)make xxx_defconfig(3)直接修改.config注意:如果直接修改.config,它可能不會生效,因為某些配置可能具有依賴關系,Make將根據依賴關系檢查規則,有時直接修改.config無效,因此不建議直接修改它。
上面的內容可能有點抽象,下面的示例說明了這一點:編寫一個簡單的入口函數以輸出hello world驅動程序并將其編譯到內核中。
步驟:(1)在驅動程序目錄中創建一個新的hello文件夾,該文件夾實現了hello.c,Makefile和Kconfig。
hello.c:#include #include #include static int first_drv_init(void){printk(“ ------------------ hello world!-------- ------------"); return 0;} static void first_drv_exit(void){printk(“ ------------------退出hello world!------------- -------");} module_init(first_drv_init); module_exit(first_drv_exit); MODULE_LICENSE(“ GPL”);生成文件:obj-$(CONFIG_HELLO)+ = hello.o Kconfig:配置HELLO Tristate“ Hello World for fengyuwuzu”幫助幫助配置HELLO確定名稱:CONFIG_HELLO。
fengyuwuzu的Hello World:確定make menuconfig時顯示的名稱(2)修改上層的Makefile和Kconfig(在Linux-3.4.2 / drivers下)。