有許多Linux內(nèi)核源文件。
我不了解Makefile,Kconfig和.config之間的關(guān)系。
我不了解內(nèi)核編譯系統(tǒng)。
如果在編譯和修改內(nèi)核時(shí)遇到問(wèn)題,我將無(wú)法開始。
我不知道如何編譯寫入內(nèi)核的驅(qū)動(dòng)程序或如何配置內(nèi)核。
這些問(wèn)題都與Makefile,Kconfig和.config有關(guān)。
讓我們簡(jiǎn)要地談一下Makefile,Kconfig和.config。
希望能激發(fā)您的靈感。
三個(gè)角色:簡(jiǎn)單地說(shuō),去餐廳點(diǎn)餐:Kconfig是菜單,Makefile是練習(xí),.config是您點(diǎn)的食物。
Makefile:文本文件,一種編譯源文件的方法。
Kconfig:一個(gè)文本文件,內(nèi)核的配置菜單。
.config:編譯內(nèi)核所基于的配置。
三個(gè)Makefile引用的語(yǔ)法:linux-3.4.2 / drivers / Makefile功能:用于定義將哪些內(nèi)容編譯為模塊,執(zhí)行哪些條件編譯等。
子目錄Makefile包含在頂部的Makefile中。
(1)直接編譯obj-y + = xxx.o表示xxx.o由xxx.c或xxx.s編譯并直接編譯到內(nèi)核中。
(2)條件編譯obj-$(CONFIG_HELLO)+ = xxx.o確定是否根據(jù).config文件的CONFIG_XXX將文件編譯到內(nèi)核中。
(3)模塊編譯obj-m + = xxx.o表示xxx被編譯為模塊,即在執(zhí)行make模塊時(shí)將其編譯。
2. Kconfig每個(gè)config菜單項(xiàng)都有類型定義:布爾類型,三態(tài)(內(nèi)置,模塊,已刪除),字符串字符串,十六進(jìn)制十六進(jìn)制,整數(shù)整數(shù)。
功能:確定在進(jìn)行menuconfig時(shí)顯示的菜單項(xiàng),請(qǐng)參閱:linux-3.4.2 / drivers / leds / kconfig:config LEDS_S3C24XX三態(tài)“ Samsung S3C24XX GPIO LED的LED支持”。
取決于LEDS_CLASS是否啟用對(duì)LED的支持該ARCH_S3C24取決于與Samsung S3C24XX系列CPU(例如S3C2410和S3C2440)上的GPIO線連接的ARCH_S3C24。
LEDS_S3C24XX:配置選項(xiàng)的名稱,前綴“ CONFIG_”。
被省略。
Tristate:指示該項(xiàng)目是被編程到內(nèi)核還是模塊中。
顯示為:如果選擇編譯為內(nèi)核模塊,則將在.config中生成CONFIG_HELLO_MODULE = m的配置,如果選擇Y,則將其直接編譯到內(nèi)核中,并使用CONFIG_HELLO_MODULE =的配置項(xiàng)y將在.config中生成。
Tristate之后的字符串是在make menuconfig期間顯示的配置項(xiàng)目的名稱。
布爾:只能選擇或不選擇此類型。
它在make menuconfig中顯示為[],這意味著它不能配置為模塊。
取決于:此選項(xiàng)取決于另一個(gè)選項(xiàng)。
僅選擇從屬項(xiàng)時(shí),將出現(xiàn)在當(dāng)前配置項(xiàng)目的提示消息,并將當(dāng)前配置項(xiàng)可以被設(shè)置。
選擇:反向依賴性。
選擇此選項(xiàng)時(shí),將同時(shí)選擇在選擇之后定義的項(xiàng)目。
help:幫助信息。
目錄層次結(jié)構(gòu)迭代:Kconfig中有一個(gè)類似的語(yǔ)句:源“ drivers / usb / Kconfig”,用于包含(或嵌套)新的Kconfig文件,因此每個(gè)目錄都可以管理其自己的配置內(nèi)容,因此沒(méi)有必要將這些配置寫入同一文件中,可以方便地進(jìn)行修改和管理。
3. .config參考:linux-3.4.2 / .config通過(guò)分析前兩個(gè)文件,.config的含義很明確:內(nèi)核編譯參考文件,檢查其中的內(nèi)容以了解哪些驅(qū)動(dòng)程序被編譯到內(nèi)核中。
有3種配置內(nèi)核的方法(選擇一種):(1)make menuconfig(2)make xxx_defconfig(3)直接修改.config注意:如果直接修改.config,它可能不會(huì)生效,因?yàn)槟承┡渲每赡芫哂幸蕾囮P(guān)系,Make將根據(jù)依賴關(guān)系檢查規(guī)則,有時(shí)直接修改.config無(wú)效,因此不建議直接修改它。
上面的內(nèi)容可能有點(diǎn)抽象,下面的示例說(shuō)明了這一點(diǎn):編寫一個(gè)簡(jiǎn)單的入口函數(shù)以輸出hello world驅(qū)動(dòng)程序并將其編譯到內(nèi)核中。
步驟:(1)在驅(qū)動(dòng)程序目錄中創(chuàng)建一個(gè)新的hello文件夾,該文件夾實(shí)現(xiàn)了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時(shí)顯示的名稱(2)修改上層的Makefile和Kconfig(在Linux-3.4.2 / drivers下)。