當我們編寫完一個驅動後,我們要把它以模組形式編譯或者直接編譯
進核心時,需要修改相關檔案,其中最重要的便是kconfig ,makefile。
主要是分析一下三者之間的關係,然後就其文法簡要的談一下。
當我們在核心源碼目錄下執行make (或者make menuconfig等
命令)命令時,實際上是根據makefile 來進行編譯的。我在mini2440
開發板上編寫了一個按鍵控制led燈的驅動。檔案名稱為buttons_leds_z
hao.c屬於字元驅動。因此在/driver/char/目錄下的makefile部分最
後添加一行
obj-$(CONFIG_BUTTONS_LEDS_ZHAO) +=
buttons_leds_zhao.o
如下:
obj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o
tty_ldisc.o tty_buffer.o tty_port.o
obj-$(CONFIG_BFIN_JTAG_COMM) += bfin_jtag_comm.o
obj-$(CONFIG_CONSOLE_TRANSLATIONS) += consolemap.o
consolemap_deftbl.o
obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o
obj-$(CONFIG_AUDIT) += tty_audit.o
obj-$(CONFIG_BUTTONS_LEDS_ZHAO) +=
buttons_leds_zhao.o
其中第一行obj-y 中的y表示編譯進核心,而obj-$(CONFIG_LEGAC
Y_PTYS) 中CONFIG_LEGACY_PTYS則表示一個變數,類似於我們C
語言中的變數,用$( )來表示,它一般可以取三種值y ,m ,n.y表示
編譯進核心,而m則表示以模組的方式進行編譯,n表示不編譯進內
核。obj-y += 等號後面的.o尾碼檔案則是由該目錄下的對應名稱的
.c檔案編譯而來。
而上面CONFIG_LEGACY_PTYS變數的取值則是通過.config檔案來集
中賦值的。.config部分內容如下
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_DEVKMEM is not set
CONFIG_MINI2440_HELLO_MODULE=m
CONFIG_BUTTONS_LEDS_ZHAO=m
CONFIG_LEDS_MINI2440=m
CONFIG_MINI2440_BUTTONS=m
CONFIG_MINI2440_BUZZER=y
CONFIG_MINI2440_ADC=y
# CONFIG_SERIAL_NONSTANDARD is not set
從上面幾行我們可以看到,在makefile裡面的變數都是在.config中
賦值的。當我們在原始碼目錄下輸入make命令時,都是預設從.config
中讀入。
因此,在輸入make之前,用ls -a 查看一下是否有該檔案。對於
只包含幾個檔案的工程來說,手動寫.config和makefile並不是一件很難
的事情,但如果是一個包含有幾百個檔案的項目來說,則是一件比較困
難的事情。可以用autoconf來自動產生.config,automake來製作
makefile。看起來問題是解決的,但實際上,這種做法缺乏一定的靈活
性,不能實現按需定製的要求。如果要添加或刪掉某個驅動,將要在
.config檔案中找到相應的項進行修改。非常的不方便。因此,便出現了
kconfig。
當我們在核心源碼目錄下輸入make menuconfig時,出現如下內容:
.config - Linux Kernel v2.6.32.2 Configuration
──────────────────────────────────────────────────────────────────────────────────────────────────
┌──────────────────────────────── Linux Kernel Configuration ─────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted letters are │
│ hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> │
│ to exit, <?> for Help, </> for Search. Legend: [*] built-in [ ] excluded <M> module │
│ < > module capable │
│ ┌─────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ General setup ---> │ │
│ │ [*] Enable loadable module support ---> │ │
│ │ -*- Enable the block layer ---> │ │
│ │ System Type ---> │ │
│ │ Bus support ---> │ │
│ │ Kernel Features ---> │ │
│ │ Boot options ---> │ │
│ │ CPU Power Management ---> │ │
│ │ Floating point emulation ---> │ │
│ │ Userspace binary formats ---> │ │
│ │ Power management options ---> │ │
│ │ [*] Networking support ---> │ │
│ │ Device Drivers ---> │ │
│ │ File systems ---> │ │
│ └─────────┴(+)────────────────────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
它是通過讀取在核心源碼目錄下的Kconfig檔案來配置的。
在/drivers/char/下的目錄kconfig部分內容如下:
config DEVKMEM
bool "/dev/kmem virtual device support"
default y
help
Say Y here if you want to support the /dev/kmem device. The
/dev/kmem device is rarely used, but can be used for certain
kind of kernel debugging operations.
When in doubt, say "N".
config MINI2440_HELLO_MODULE
tristate "Mini2440 module sample"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
Mini2440 module sample.
config BUTTONS_LEDS_ZHAO
tristate "Mini2440 button and leds sample"
depends on MACH_MINI2440
default m if MACH_MINI2440
help
Mini2440 button and leds module sample.
其具體文法格式說明如下:
config關鍵字是一個新的配置選項的入口 其後的選項MINI2440_H
ELLO_MODULE省略了CONFIG。完整的表示為CONFIG_MINI2440
_HELLO_MODULE,也即是當我們將該選項設定成y時,它將自動的將
.config的CONFIG_MINI2440_HELLO_MODULE=m改寫成
CONFIG_MINI2440_HELLO_MODULE=y。
緊接著的是菜單的屬性 最主要的有2種tristate ,boolean 。tristate表
示三態:編譯進核心(y),編譯成模組(m),不編譯(n)。boolean 主
要有兩種y或ndepend則表示依賴項 default預設的編譯選項 m表示默
認該檔案表示以模組方式編譯。後面的help是協助資訊,當我們選中
help菜單時就可以看見,它不是必需的。隨著作業系統升級,編譯選項
達到幾千個。對於一般人來說,要搞清每一個選項是很困難的,一般很
多選項都是預設的。
總的來說,三者之間的關係如下:當我們在核心源碼目錄下輸入
makemenuconfig時,在出現的菜單介面中選擇一項時,它會自動跟新
.config相應項的值。如果我們沒有選擇,則會在.config問下插入一行
注釋。類似於# CONFIG_SERIAL_NONSTANDARD is not set,當
我們輸入make時,根據makefile檔案來編譯,makefile檔案中的變數
值則由.config來進行賦值操作。僅僅只在kconfig中添加選項,只會在
菜單介面中顯示,即使此時選擇y或m,也不會編譯檔案。還需要在
makefile檔案中按照規定添加相應行才能進行編譯。簡單圖解如下:
kconfig------->.config---------->makefile