linux驅動開發學習筆記九:menuconfig過程詳解

當我們執行make menuconfig時,系統到底幫我們做了什麼?

這裏面一共涉及到了以下幾個文件,下面我們逐個的講解:

  • Linux內核根目錄下的scripts文件夾

  • arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件

  • Linux內核根目錄下的makefile文件、各層目錄下的makefile文件

  • Linux內核根目錄下的的.config文件、arch/$ARCH/下的 .config文件

  • Linux內核根目錄下的 include/generated/autoconf.h文件

一、scripts文件夾下存放的是跟make menuconfig配置界面的圖形繪製相關的文件,我們作爲使用者無需關心這個文件夾的內容

二、當我們執行make menuconfig命令出現藍色配置界面以前,系統幫我們做了以下工作:

  • 系統會讀取arch/$ARCH/目錄下的Kconfig文件生成整個配置界面選項(Kconfig是整個linux配置機制的核心)

那麼ARCH環境變量的值等於多少呢?它是由linux內核根目錄下的makefile文件決定的,在makefile下有此環境變量的定義:
在這裏插入圖片描述
或者通過 make ARCH=arm menuconfig命令來生成配置界面,默認生成的界面是所有參數都是沒有值的.

比如教務處進行考試,考試科數可能有外語、語文、數學等科,這裏相當於我們選擇了arm科可進行考試,系統就會讀取arch/arm/Kconfig文件生成配置選項。系統還提供了x86科mips科等很多門功課的考試題。

三、假設教務處比較“仁慈”,還給我們準備了一份參考答案(默認配置選項),存放在arch/$ARCH/configs下,對於arm科來說就是arch/arm/configs文件夾:
在這裏插入圖片描述
此文件夾中有許多選項,系統會讀取哪個呢?

內核默認會讀取linux內核根目錄下.config文件作爲內核的默認選項(試題的參考答案),我們一般會根據開發板的類型從中選取一個與我們開發板最接近的系列到Linux內核根目錄下(選擇一個最接近的參考答案)

cp arch/arm/configs/s3c2410_defconfig .config

四、config

假設教務處留了一個心眼,他提供的參考答案並不完全正確(.config文件與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config文件然後執行make menuconfig命令讀取新的選項。

但是一般我們不採取這個方案,我們選擇在配置界面中通過空格Esc回車選擇某些選項選中或者不選中,最後保存退出的時候,Linux內核會把新的選項(正確的參考答案)更新到.config中,此時我們可以把.config重命名爲其它文件保存起來(當你執行make distclean時系統會把.config文件刪除),以後我們再配置內核時就不需要再去arch/arm/configs下考取相應的文件了,省去了重新配置的麻煩,直接將保存的.config文件複製爲.config即可。

五、經過以上的步驟,我們就可以正確的讀取、配置我們需要的界面了

那麼他們如何跟makefile文件建立編譯關係呢?

當你保存make menuconfig選項時,系統除了會自動更新.config外,還會將所有的選項以宏的形式保存在Linux內核根目錄下的 include/generated/autoconf.h文件下
在這裏插入圖片描述
內核中的源代碼都會包含以上.h文件,根據宏的定義情況進行條件編譯。當我們需要對一個文件有選擇是否編譯的功能時,還需要修改對應的makefile文件,例如:在這裏插入圖片描述
我們選擇是否要編譯s3c2410_ts.c這個文件時,makefile會根據CONFIG_TOUCHSCREEN_S3C2410來決定是編譯此文件,此宏是在Kconfig文件中定義,當我們配置完成後,會出現在.configautoconf.h中。至此,以上列舉出來的文件我們都已經提到了。

六、總結
最後我們會發現,整個linux內核配置過程中,留給用戶的接口其實只有各層Kconfigmakefile文件以及對應的源文件。比如我們如果想要給內核增加一個功能,並且通過make menuconfig控制其生成過程:

  • 首先需要做的工作是:修改對應目錄下的Kconfig文件,按照Kconfig語法增加對應的選項
  • 其次執行make menuconfig選擇編譯進內核或者不編譯進內核,或者編譯爲模塊,.config文件和autoconf.h文件會自動生成;
  • 最後修改對應目錄下的makefile文件完成編譯選項的添加
  • 最後的最後執行make zImage命令進行編譯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章