日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

發(fā)布時(shí)間:2024/10/12 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面我們介紹模塊編程的時(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

  • #include?<linux/module.h>???????/*module_init()*/???
  • #include?<linux/kernel.h>?/*?printk()?*/???
  • #include?<linux/init.h>???????/*?__init?__exit?*/???
  • ??
  • #define?DEBUG???//open?debug?message???
  • ??
  • #ifdef?DEBUG???
  • #define?PRINTK(fmt,?arg...)?????printk(KERN_WARNING?fmt,?##arg)???
  • #else???
  • #define?PRINTK(fmt,?arg...)?????printk(KERN_DEBUG?fmt,?##arg)???
  • #endif???
  • ??
  • /*?Module?Init?&?Exit?function?*/??
  • static?int?__init?myModule_init(void)??
  • {??
  • ????/*?Module?init?code?*/??
  • ????PRINTK("myModule_init\n");??
  • ????return?0;??
  • }??
  • ??
  • static?void?__exit?myModule_exit(void)??
  • {??
  • ????/*?Module?exit?code?*/??
  • ????PRINTK("myModule_exit\n");??
  • ????return;??
  • }??
  • ??
  • module_init(myModule_init);??
  • module_exit(myModule_exit);??
  • ??
  • MODULE_AUTHOR("dengwei");??????????????????????????/*模塊作者,可選*/??
  • MODULE_LICENSE("GPL");?????????????????????????????/*模塊許可證明,描述內(nèi)核模塊的許可權(quán)限,必須*/??
  • MODULE_DESCRIPTION("A?simple?Hello?World?Module");?/*模塊說(shuō)明,可選*/??
  • ?

    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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。