Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
前面我們介紹模塊編程的時(shí)候介紹了驅(qū)動(dòng)進(jìn)入內(nèi)核有兩種方式:模塊和直接編譯進(jìn)內(nèi)核,并介紹了模塊的一種編譯方式——在一個(gè)獨(dú)立的文件夾通過(guò)makefile配合內(nèi)核源碼路徑完成
| ? |
?? ?那么如何將驅(qū)動(dòng)直接編譯進(jìn)內(nèi)核呢?
?? ?在我們實(shí)際內(nèi)核的移植配置過(guò)程中經(jīng)常聽(tīng)說(shuō)的內(nèi)核裁剪又是怎么麼回事呢?
我們?cè)谶M(jìn)行l(wèi)inux內(nèi)核配置的時(shí)候經(jīng)常會(huì)執(zhí)行make menuconfig這個(gè)命令,然后屏幕上會(huì)出現(xiàn)以下界面:
這個(gè)界面是怎么生成的呢?
跟我們經(jīng)常說(shuō)的內(nèi)核配置與與編譯又有什么關(guān)系呢?
下面我們借此來(lái)講解一下linux內(nèi)核的配置機(jī)制及其編譯過(guò)程。
一、配置系統(tǒng)的基本結(jié)構(gòu)
Linux內(nèi)核的配置系統(tǒng)由三個(gè)部分組成,分別是:
???1、Makefile:分布在 Linux 內(nèi)核源代碼根目錄及各層目錄中,定義 Linux 內(nèi)核的編譯規(guī)則;
?? ?2、配置文件(config.in(2.4內(nèi)核,2.6內(nèi)核)):給用戶提供配置選擇的功能;
?? ?3、配置工具:包括配置命令解釋器(對(duì)配置腳本中使用的配置命令進(jìn)行解釋)和配置用戶界面(提供基于字符界面、基于 Ncurses 圖形界面以及基于 Xwindows 圖形界面的用戶配置界面,各自對(duì)應(yīng)于 Make config、Make menuconfig 和 make xconfig)。
???這些配置工具都是使用腳本語(yǔ)言,如 Tcl/TK、Perl 編寫(xiě)的(也包含一些用 C 編寫(xiě)的代碼)。本文并不是對(duì)配置系統(tǒng)本身進(jìn)行分析,而是介紹如何使用配置系統(tǒng)。所以,除非是配置系統(tǒng)的維護(hù)者,一般的內(nèi)核開(kāi)發(fā)者無(wú)須了解它們的原理,只需要知道如何編寫(xiě) Makefile 和配置文件就可以。
二、makefile menuconfig過(guò)程講解
當(dāng)我們?cè)趫?zhí)行make menuconfig這個(gè)命令時(shí),系統(tǒng)到底幫我們做了哪些工作呢?
這里面一共涉及到了一下幾個(gè)文件我們來(lái)一一講解
Linux內(nèi)核根目錄下的scripts文件夾
arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件
Linux內(nèi)核根目錄下的makefile文件、各層目錄下的makefile文件
Linux內(nèi)核根目錄下的的.config文件、arm/$ARCH/下的config文件
Linux內(nèi)核根目錄下的 include/generated/autoconf.h文件
1)scripts文件夾存放的是跟make menuconfig配置界面的圖形繪制相關(guān)的文件,我們作為使用者無(wú)需關(guān)心這個(gè)文件夾的內(nèi)容
2)當(dāng)我們執(zhí)行make menuconfig命令出現(xiàn)上述藍(lán)色配置界面以前,系統(tǒng)幫我們做了以下工作:
?? ?首先系統(tǒng)會(huì)讀取arch/$ARCH/目錄下的Kconfig文件生成整個(gè)配置界面選項(xiàng)(Kconfig是整個(gè)linux配置機(jī)制的核心),那么ARCH環(huán)境變量的值等于多少呢?
它是由linux內(nèi)核根目錄下的makefile文件決定的,在makefile下有此環(huán)境變量的定義:
或者通過(guò) make ARCH=arm menuconfig命令來(lái)生成配置界面,默認(rèn)生成的界面是所有參數(shù)都是沒(méi)有值的
?? ?比如教務(wù)處進(jìn)行考試,考試科數(shù)可能有外語(yǔ)、語(yǔ)文、數(shù)學(xué)等科,這里相當(dāng)于我們選擇了arm科可進(jìn)行考試,系統(tǒng)就會(huì)讀取arm/arm/kconfig文件生成配置選項(xiàng)(選擇了arm科的卷子),系統(tǒng)還提供了x86科、milps科等10幾門功課的考試題
3)假設(shè)教務(wù)處比較“仁慈”,為了怕某些同學(xué)做不錯(cuò)試題,還給我們準(zhǔn)備了一份參考答案(默認(rèn)配置選項(xiàng)),存放在arch/$ARCH/configs下,對(duì)于arm科來(lái)說(shuō)就是arch/arm/configs文件夾:
?? ?此文件夾中有許多選項(xiàng),系統(tǒng)會(huì)讀取哪個(gè)呢?內(nèi)核默認(rèn)會(huì)讀取linux內(nèi)核根目錄下.config文件作為內(nèi)核的默認(rèn)選項(xiàng)(試題的參考答案),我們一般會(huì)根據(jù)開(kāi)發(fā)板的類型從中選取一個(gè)與我們開(kāi)發(fā)板最接近的系列到Linux內(nèi)核根目錄下(選擇一個(gè)最接近的參考答案)
#cp arch/arm/configs/s3c2410_defconfig .config
4).config
?? ?假設(shè)教務(wù)處留了一個(gè)心眼,他提供的參考答案并不完全正確(.config文件與我們的板子并不是完全匹配),這時(shí)我們可以選擇直接修改.config文件然后執(zhí)行make menuconfig命令讀取新的選項(xiàng)
?? ?但是一般我們不采取這個(gè)方案,我們選擇在配置界面中通過(guò)空格、esc、回車選擇某些選項(xiàng)選中或者不選中,最后保存退出的時(shí)候,Linux內(nèi)核會(huì)把新的選 項(xiàng)(正確的參考答案)更新到.config中,此時(shí)我們可以把.config重命名為其它文件保存起來(lái)(當(dāng)你執(zhí)行make distclean時(shí)系統(tǒng)會(huì)把.config文件刪除),以后我們?cè)倥渲脙?nèi)核時(shí)就不需要再去arch/arm/configs下考取相應(yīng)的文件了,省去了 重新配置的麻煩,直接將保存的.config文件復(fù)制為.config即可.
5)經(jīng)過(guò)以上兩步,我們可以正確的讀取、配置我們需要的界面了
那么他們?nèi)绾胃鷐akefile文件建立編譯關(guān)系呢?
當(dāng)你保存make menuconfig選項(xiàng)時(shí),系統(tǒng)會(huì)除了會(huì)自動(dòng)更新.config外,還會(huì)將所有的選項(xiàng)以宏的形式保存在
Linux內(nèi)核根目錄下的?include/generated/autoconf.h文件下
內(nèi)核中的源代碼就都會(huì)包含以上.h文件,跟宏的定義情況進(jìn)行條件編譯。
當(dāng)我們需要對(duì)一個(gè)文件整體選擇如是否編譯時(shí),還需要修改對(duì)應(yīng)的makefile文件,例如:
?? ?我們選擇是否要編譯s3c2410_ts.c這個(gè)文件時(shí),makefile會(huì)根據(jù)CONFIG_TOUCHSCREEN_S3C2410來(lái)決定是編譯此 文件,此宏是在Kconfig文件中定義,當(dāng)我們配置完成后,會(huì)出現(xiàn)在.config及autconf中,至此,我們就完成了整個(gè)linux內(nèi)核的編譯過(guò) 程。
?? ?最后我們會(huì)發(fā)現(xiàn),整個(gè)linux內(nèi)核配置過(guò)程中,留給用戶的接口其實(shí)只有各層Kconfig、makefile文件以及對(duì)應(yīng)的源文件。
?? ?比如我們?nèi)绻胍o內(nèi)核增加一個(gè)功能,并且通過(guò)make menuconfig控制其聲稱過(guò)程
?? ?首先需要做的工作是:修改對(duì)應(yīng)目錄下的Kconfig文件,按照Kconfig語(yǔ)法增加對(duì)應(yīng)的選項(xiàng);
?? ?其次執(zhí)行make menuconfig選擇編譯進(jìn)內(nèi)核或者不編譯進(jìn)內(nèi)核,或者編譯為模塊,.config文件和autoconf.h文件會(huì)自動(dòng)生成;
?? ?最后修改對(duì)應(yīng)目錄下的makefile文件完成編譯選項(xiàng)的添加;
?? ?最后的最后執(zhí)行make zImage命令進(jìn)行編譯。
三、具體實(shí)例
下面我們以前面做過(guò)的模塊實(shí)驗(yàn)為例,講解如何通過(guò)make menuconfig機(jī)制將前面單獨(dú)編譯的模塊編譯進(jìn)內(nèi)核或編譯為模塊
假設(shè)我已經(jīng)有了這么一個(gè)驅(qū)動(dòng):
modules.c
?
Step1:將modules.c拷到drivers/char/目錄下(這個(gè)文件夾一般存放常見(jiàn)的字符驅(qū)動(dòng))Step2: vi driver/char/Kconfig,在 ??? config DEVKMEM后添加以下信息
config MODULES
tristate "modules device support"
default y
help
?Say Y here,the modules will be build in kernel.
?Say M here,the modules willbe build to modules.
?Say N here,there will be nothing to be do.?
Step3:make menuconfig ?????Device driver-character devices ?????????? [*]modules device suppor
Step4:vi driver/char/Makefile,在js-rtc后添加 obj-$(CONFIG_MODULES)+= modules.o
CONFIG_MODULES 必須跟上面的Kconfig中保持一致,系統(tǒng)會(huì)自動(dòng)添加CONFIG_前綴
modules.o必須跟你加入的.c文件名一致
最后執(zhí)行:make zImage modules就會(huì)被編譯進(jìn)內(nèi)核中
第三步:
?
Step3:make menuconfig ?????Device driver-character devices ?????????? [M]modules device suppor把星號(hào)在配置界面通過(guò)空格改為M,最后執(zhí)行make modules,在driver/char/目錄下會(huì)生成一個(gè)modules.ko文件
跟我們前面講的單獨(dú)編譯模塊效果一樣,也會(huì)生成一個(gè)模塊,將它考入開(kāi)發(fā)板執(zhí)行insmod moudles.ko,即可將生成的模塊插入內(nèi)核使用。
?
PS:自己的看法
?
Linux內(nèi)核的make menuconfig實(shí)際上是執(zhí)行了:
scripts/kconfig/mconf????? arch/mips/Kconfig
mconf表 示是menuconfig,如果是用基于QT的配置工具,則執(zhí)行的將會(huì)是qconf,arch/mips/Kconfig是要讀取的Kconfig文件, 這個(gè)會(huì)因平臺(tái)而異,這里因?yàn)獒槍?duì)的是MIPS平臺(tái),故讀取的是arch/mips/目錄下的Kconfig文件。
如果Linux源碼樹(shù)頂層目錄下已有.config文件,make menuconfig則從.config文件取默認(rèn)參數(shù),如果沒(méi)有.config則從各個(gè)Kconfig中取默認(rèn)參數(shù)。
mconf會(huì) 把用戶的選擇保存到Linux源碼樹(shù)頂層目錄的.config文件中,然后解析該文件并將解析結(jié)果寫(xiě)入到include/linux /autoconf.h中。include/linux/autoconf.h將會(huì)被include/linux/config.h包含,因此,需要關(guān)心 配置情況的內(nèi)核源文件只需要#include <linux/config.h>即可。
mconf解析.config文件時(shí)所采用的規(guī)則具體要仔細(xì)分析mconf.c源代碼。
轉(zhuǎn)載于:https://www.cnblogs.com/Jason-Ch/articles/2705752.html
總結(jié)
以上是生活随笔為你收集整理的Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么在香港开户
- 下一篇: Linux内核--网络协议栈深入分析(二