Linux內核配置Kconfig語法


http://blog.csdn.net/jianwen_hi/article/details/53398141

何為Kconfig 它的作用是什么

內核源碼編譯過程

頂層目錄

  1. 遍歷每個源碼目錄(或配置指定的源碼目錄)Makefile
  2. 每個目錄的Makefile 會根據Kconfig來定制要編譯對象
  3. 回到頂層目錄的Makeifle執行編譯

那么我們就得出各個文件的作用:

Kconfig ---> (每個源碼目錄下)提供選項 .config ---> (源碼頂層目錄下)保存選擇結果 Makefile---> (每個源碼目錄下)根據.config中的內容來告知編譯系統如何編譯
  • 1
  • 2
  • 3

說到底,Kconfig就是配置哪些文件編譯,那些文件不用編譯。后期linux內核都做出了如下的圖形界面,但由於要進行Linux內核驅動開發,需要向將驅動的代碼添加到Makefile中一起編譯,所以Kconfig的一些語法也該了解,於是有了這篇文章。 
這里寫圖片描述

基本使用方法

我們以簡單的單選項為案例來演示 
假比,我們做好了一個驅動,需要將選項加入到內核的編譯選項中,可以按以下步驟操作:

第一步 配置Kconfig

在driver目錄下新建一個目錄

mkdir driver/test 
  • 1

進入test目錄,創建Kconfig文件 
這里寫圖片描述 
這里定義了一個TEST的句柄,Kconfig可以通過這個句柄來控制Makefile中是否編譯,”Test driver”是顯示在終端的名稱。 
具體的語法在Kconfig語法簡介中介紹。

第二步 配置Makefile

在同樣的目錄中,新建一個Makefile 
Makfile

Obj-$(CONFIG_選項名) += xxx.o 
/*當CONFIG_選項名=y時,表示對應目錄下的xxx.c將被編譯進內核 當CONFIG_選項名=m時對應目錄下的xxx.c將被編譯成模塊*/
  • 1
  • 2
  • 3

第三步 配置上層目錄的Makefile與Kconfig

在上一層目錄的Kconfig中

這里寫圖片描述 
表示將test文件夾中的Kconfig加入搜尋目錄

在上一層目錄的Makefile中

這里寫圖片描述

結果,運行根目錄的.config查看結果 
這里寫圖片描述

Kconfig語法簡介

單一選項

總體原則:每一個config就是一個選項,最上面跟着控制句柄,下面則是對這個選項的配置,如選項名是什么,依賴什么,選中這個后同時會選擇什么。

config CPU_S5PC100
    bool "選項名" select S5P_EXT_INT select SAMSUNG_DMADEV help Enable S5PC100 CPU support
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

config —> 選項 
CPU_S5PC100 —>句柄,可用於控制Makefile 選擇編譯方式 
bool —>選擇可能:TRUE選中、FALSE不選 選中則編譯,不選中則不編譯。 
如果后面沒有字符串名稱,則表示其不會出現在選擇軟件列表中 
select —> 當前選項選中后則select后指定的選項自動被選擇

depends on ARM || BLACKFIN || MIPS || COLDFIRE
  • 1

depend on 依賴,后面的四個選擇其中至少一個被選擇,這個選項才能被選

config DM9000
    tristate "DM9000 support"
  • 1
  • 2

tristate —> 選中並編譯進內核、不選編譯成模塊

運行結果:< M > test

選項為數字

config ARM_DMA_IOMMU_ALIGNMENT
    int "Maximum PAGE_SIZE order of alignment for DMA IOMMU buffers" ---->該選項是一個整型值 range 4 9 ---->該選項的范圍值 default 8 ---->該選項的默認值 help DMA mapping framework by default aligns all buffers to the smallest ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4-8為這個數字的范圍,運行結果 
這里寫圖片描述

這里的defult其實也可以用在bool中

config STACKTRACE_SUPPORT bool --->該選項可以選中或不選,且不會出現在選擇列表中 default y ---->表示缺省情況是選中
  • 1
  • 2
  • 3

if..endif

if ARCH_S5PC100 --->如果ARCH_S5PC100選項選中了,則在endif范圍內的選項才會被選 config CPU_S5PC100 bool "選項名" select S5P_EXT_INT select SAMSUNG_DMADEV help Enable S5PC100 CPU support endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

舉個例子,如果CPU沒有選擇使用多核CPU,則不會出現CPU個數的選項。

choice多個選項

choice      --->表示選擇列表
    prompt "Default I/O scheduler" //主目錄名字 default DEFAULT_CFQ //默認CFQ help Select the I/O scheduler which will be used by default for all block devices. config DEFAULT_DEADLINE bool "Deadline" if IOSCHED_DEADLINE=y config DEFAULT_CFQ bool "CFQ" if IOSCHED_CFQ=y config DEFAULT_NOOP bool "No-op" endchoice
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
menu "Boot options" ----> menu表示該選項是不可選的菜單,其后是在選擇列表的菜單名 config USE_OF bool "Flattened Device Tree support" select IRQ_DOMAIN select OF select OF_EARLY_FLATTREE help Include support for flattened device tree machine descriptions. .... endmenu ----> menu菜單結束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

menu指的是不可編輯的menu,而menuconfig則是帶選項的menu 
menu和choice的區別 
menu 可以多選 choice 是單項選擇題

menuconfig MODULES ---> menuconfig表示MODULE是一個可選菜單,其選中后是CONFIG_MODULES
    bool "菜單名" if MODULES ... endif # MODULES
  • 1
  • 2
  • 3
  • 4
  • 5

說到底,menconfig 就是一個帶選項的菜單,在下面需要用bool判斷一下,選擇成立后,進入if …endif 中間得空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM