, 假如選擇編譯成內(nèi)核模塊,則會(huì)在.config中生成一個(gè) CONFIG_HELLO_MODULE=m的配置,選擇Y就是直接編進(jìn)內(nèi)核,會(huì)在.config中生成一個(gè) CONFIG_HELLO_MODULE=y的配置項(xiàng)。Tristate后的字符串是make menuconfig時(shí)顯示的配置項(xiàng)名稱(chēng)。" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談內(nèi)核的Makefile、Kconfig和.config文件

strongerHuang ? 來(lái)源:百問(wèn)科技 ? 作者:strongerHuang ? 2020-11-29 10:40 ? 次閱讀

Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核編譯體系,編譯修改內(nèi)核有問(wèn)題無(wú)從下手,自己寫(xiě)的驅(qū)動(dòng)不知道怎么編進(jìn)內(nèi)核,不知道怎么配置內(nèi)核,這些問(wèn)題都和Makefile、Kconfig、.config有關(guān),下面簡(jiǎn)單談?wù)凪akefile、Kconfig和.config。希望對(duì)你有啟發(fā)。

1

三者的作用

簡(jiǎn)單來(lái)說(shuō)就是去飯店點(diǎn)菜:Kconfig是菜單,Makefile是做法,.config就是你點(diǎn)的菜。

Makefile:一個(gè)文本形式的文件,編譯源文件的方法。

Kconfig:一個(gè)文本形式的文件,內(nèi)核的配置菜單。

.config:編譯內(nèi)核所依據(jù)的配置。

2

三者的語(yǔ)法

1.Makefile

參考:linux-3.4.2/drivers/Makefile

作用:用來(lái)定義哪些內(nèi)容作為模塊編譯,哪些條件編譯等。子目錄Makefile被頂層Makefile包含。

(1)直接編譯

obj-y += xxx.o

表示由xxx.c或xxx.s編譯得到xxx.o并直接編進(jìn)內(nèi)核。

(2)條件編譯

obj -$(CONFIG_HELLO) += xxx.o

根據(jù).config文件的CONFIG_XXX來(lái)決定文件是否編進(jìn)內(nèi)核。

(3)模塊編譯

obj-m +=xxx.o

表示xxx作為模塊編譯,即執(zhí)行make modules時(shí)才會(huì)被編譯。

2、Kconfig

每個(gè)config菜單項(xiàng)都有類(lèi)型定義: bool布爾類(lèi)型、 tristate三態(tài)(內(nèi)建、模塊、移除)、string字符串、 hex十六進(jìn)制、integer整型。

作用:決定make menuconfig時(shí)展示的菜單項(xiàng),

參考:linux-3.4.2/drivers/leds/ kconfig:

config LEDS_S3C24XX

tristate "LED Support for Samsung S3C24XX GPIO LEDs"

depends on LEDS_CLASS

depends on ARCH_S3C24XX

help

This option enables support for LEDs connected to GPIO lines

on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.

LEDS_S3C24XX:配置選項(xiàng)的名稱(chēng),省略了前綴"CONFIG_"

Tristate:

表示該項(xiàng)是否編進(jìn)內(nèi)核、編成模塊。顯示為< > , 假如選擇編譯成內(nèi)核模塊,則會(huì)在.config中生成一個(gè) CONFIG_HELLO_MODULE=m的配置,選擇Y就是直接編進(jìn)內(nèi)核,會(huì)在.config中生成一個(gè) CONFIG_HELLO_MODULE=y的配置項(xiàng)。Tristate后的字符串是make menuconfig時(shí)顯示的配置項(xiàng)名稱(chēng)。

bool:

此類(lèi)型只能選中或不選中,make menuconfig時(shí)顯示為[ ],即無(wú)法配置成模塊。

dependon:

該選項(xiàng)依賴(lài)于另一個(gè)選項(xiàng),只有當(dāng)依賴(lài)項(xiàng)被選中時(shí),當(dāng)前配置項(xiàng)的提示信息才會(huì)出現(xiàn),才能設(shè)置當(dāng)前配置項(xiàng)。

select:

反向依賴(lài)關(guān)系,該選項(xiàng)選中時(shí),同時(shí)選中select后面定義的那一項(xiàng)。

help:

幫助信息。

目錄層次迭代:

Kconfig中有類(lèi)似語(yǔ)句:source "drivers/usb/Kconfig",用來(lái)包含(或嵌套)新的Kconfig文件,使得各個(gè)目錄管理各自的配置內(nèi)容,不必把那些配置都寫(xiě)在同一個(gè)文件里,方便修改和管理。

3、.config

參考:linux-3.4.2/.config

通過(guò)前倆個(gè)文件的分析,.config的含義已經(jīng)很清晰:內(nèi)核編譯參考文件,查看里面內(nèi)容可以知道哪些驅(qū)動(dòng)被編譯進(jìn)內(nèi)核。

配置內(nèi)核方式有3種(任選其一):

(1)make menuconfig

(2)make xxx_defconfig

(3)直接修改.config

注意:如果直接修改.config,不一定會(huì)生效,因?yàn)橛行┡渲每赡艽嬖谝蕾?lài)關(guān)系,make時(shí)會(huì)根據(jù)依賴(lài)關(guān)系,進(jìn)行規(guī)則的檢查,直接修改.config有時(shí)無(wú)效,所以不推薦直接修改。

以上可能有點(diǎn)抽象,下面舉例說(shuō)明:

寫(xiě)一個(gè)簡(jiǎn)單的入口函數(shù)輸出hello world的驅(qū)動(dòng)并編譯進(jìn)內(nèi)核。

步驟:

(1)在drivers目錄下新建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("------------------exit hello world !--------------------"); } module_init(first_drv_init); module_exit(first_drv_exit); MODULE_LICENSE("GPL");

Makefile:

obj-$(CONFIG_HELLO) += hello.o

Kconfig:

config HELLO

tristate "Hello World for fengyuwuzu"

help

Hello for fengyuwuzu

config HELLO決定名字:CONFIG_HELLO。

Hello World for fengyuwuzu:決定了在make menuconfig時(shí)顯示的名字

(2)修改上一級(jí)(Linux-3.4.2/drivers下)的Makefile、Kconfig。

Makefile:

obj-y += hello/

Kconfig:

source "drivers/hello/Kconfig"

(3)make menuconfig

(4)make uImage再燒寫(xiě)到開(kāi)發(fā)板。

查看內(nèi)核啟動(dòng)Log,偉大的helloworld 出來(lái)了!說(shuō)明hello.c成功編進(jìn)內(nèi)核

歡迎參考本文實(shí)驗(yàn),相信你對(duì)內(nèi)核的組織結(jié)構(gòu)會(huì)有更清晰的認(rèn)識(shí)。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2613

    瀏覽量

    47010
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207908
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    646

    瀏覽量

    32670

原文標(biāo)題:淺談內(nèi)核的Makefile、Kconfig和.config文件

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于Makefile自動(dòng)生成-autotools的使用

    在Linux應(yīng)用開(kāi)發(fā)中,編寫(xiě)Makefile是一項(xiàng)必備技能,因?yàn)樗x了工程中所有文件的編譯順序、規(guī)則和依賴(lài)關(guān)系,決定了哪些文件需要編譯以及它們的編譯順序。 雖然對(duì)初級(jí)開(kāi)發(fā)者而言,編寫(xiě)復(fù)雜
    的頭像 發(fā)表于 07-25 15:50 ?1351次閱讀
    關(guān)于<b class='flag-5'>Makefile</b>自動(dòng)生成-autotools的使用

    esp32生成makefile的時(shí)候,始終提示出錯(cuò),為什么?

    /kconfig.cmake:76 (file): file problem creating directory: /config Call Stack (most recent call first
    發(fā)表于 06-26 06:16

    快來(lái)用Makefile管理工程,提高工作效率!

    一、makefile簡(jiǎn)介Makefile是一種特別設(shè)計(jì)用來(lái)幫助項(xiàng)目的構(gòu)建管理的文件。它定義了編譯器和IDE工程管理系統(tǒng)自動(dòng)執(zhí)行的命令集合,主要用于自動(dòng)化編譯,減輕重復(fù)性任務(wù)的負(fù)擔(dān)。Makefi
    的頭像 發(fā)表于 05-18 08:10 ?215次閱讀
    快來(lái)用<b class='flag-5'>Makefile</b>管理工程,提高工作效率!

    linux系統(tǒng)中Makefile的使用方法

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。通過(guò)Makefile,開(kāi)發(fā)者可以輕松管理大型項(xiàng)目的編譯鏈接、清理等任務(wù)。本文將從Makefi
    的頭像 發(fā)表于 05-11 08:49 ?482次閱讀

    全志XR806 FreeRTOS快速開(kāi)發(fā)入門(mén)

    文件 ├── chip.mk ├── config.mk ├── gcc.mk ├── Kconfig ├── Makefile ├── include # 頭
    發(fā)表于 03-01 10:49

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根據(jù)指定的依賴(lài)規(guī)則和文件是否有修改來(lái)執(zhí)行命令。常用來(lái)編譯軟件源代碼,只需要重新編譯修改過(guò)的文件,使得編譯速度大大加快。
    的頭像 發(fā)表于 01-25 11:18 ?531次閱讀

    全面而詳細(xì)的Makefile使用手冊(cè)

    Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。
    的頭像 發(fā)表于 01-24 12:35 ?653次閱讀

    TQT507開(kāi)發(fā)板如何修改和保存內(nèi)核配置

    本文檔介紹如何在開(kāi)發(fā)時(shí)修改和保存內(nèi)核配置,適用于開(kāi)發(fā)板TQT507。 1.修改內(nèi)核配置 編譯時(shí)系統(tǒng)會(huì)先檢測(cè)當(dāng)前內(nèi)核源碼目錄下是否存在.config
    的頭像 發(fā)表于 12-28 14:13 ?339次閱讀
    TQT507開(kāi)發(fā)板如何修改和保存<b class='flag-5'>內(nèi)核</b>配置

    T507開(kāi)發(fā)板如何修改和保存內(nèi)核配置

    本文檔介紹如何在開(kāi)發(fā)時(shí)修改和保存內(nèi)核配置,適用于開(kāi)發(fā)板TQT507。1.修改內(nèi)核配置編譯時(shí)系統(tǒng)會(huì)先檢測(cè)當(dāng)前內(nèi)核源碼目錄下是否存在.config文件
    的頭像 發(fā)表于 12-08 11:26 ?470次閱讀
    T507開(kāi)發(fā)板如何修改和保存<b class='flag-5'>內(nèi)核</b>配置

    如何在新機(jī)器中設(shè)置默認(rèn)的defconifg?

    _BASEMA ” = “IMx93_Constal_evk ” 。 我想這被認(rèn)為是一個(gè)丑陋的黑客, 但我找不到任何地方的原始拆卸, 有沒(méi)有更好的方法可以做到這一點(diǎn)? u-boot defconfig與常規(guī)的 Linux 內(nèi)核配置文件`. config\' 有何不同?
    發(fā)表于 11-13 07:14

    淺談Linux內(nèi)核源碼的MakefileKconfig和.config文件

    Linux內(nèi)核源碼文件繁多,搞不清Makefile、Kconfig、.config間的關(guān)系,不了解內(nèi)核
    發(fā)表于 10-17 16:19 ?3287次閱讀
    <b class='flag-5'>淺談</b>Linux<b class='flag-5'>內(nèi)核</b>源碼的<b class='flag-5'>Makefile</b>、<b class='flag-5'>Kconfig</b>和.<b class='flag-5'>config</b><b class='flag-5'>文件</b>

    【米爾-芯馳D9開(kāi)發(fā)板- 國(guó)產(chǎn)平臺(tái)試用】 SDK source目錄

    ├── Kconfig ├── lib ├── Licenses ├── MAINTAINERS ├── Makefile ├── net ├── post ├── README ├── scripts
    發(fā)表于 10-16 17:45

    和我一起寫(xiě)makefile

    make 命令執(zhí)行時(shí),需要一個(gè) makefile 文件,以告訴 make 命令需要怎么樣的去編譯和鏈接程序。首先,我們用一個(gè)示例來(lái)說(shuō)明 makefile 的書(shū)寫(xiě)規(guī)則,以便給大家一個(gè)感性認(rèn)識(shí)。這個(gè)示例
    發(fā)表于 10-07 11:23 ?0次下載

    Linux內(nèi)核動(dòng)態(tài)輸出調(diào)試

    CONFIG_DYNAMIC_DEBUG是配置動(dòng)態(tài)輸出,它依賴(lài)于CONFIG_DEBUG_FS,而CONFIG_DEBUG_FS是debugfs文件系統(tǒng)。 打開(kāi)
    的頭像 發(fā)表于 09-27 15:45 ?462次閱讀
    Linux<b class='flag-5'>內(nèi)核</b>動(dòng)態(tài)輸出調(diào)試

    內(nèi)核模塊知識(shí):多個(gè)源文件編譯生成一個(gè)內(nèi)核模塊

    多個(gè)源文件編譯生成一個(gè)內(nèi)核模塊 例如,將hello.c和world.c兩個(gè)c文件編譯生成一個(gè)叫hello_world.o的目標(biāo)文件,則在 Makef
    的頭像 發(fā)表于 09-26 16:58 ?757次閱讀