1. Kconfig文件的作用 ” 內(nèi)核源碼樹的目錄下都有兩個文件Kconfig(2.4版本是Config.in)和Makefile。分布到各目錄的Kconfig構(gòu)成了一個分布式的內(nèi)核配置數(shù)據(jù)庫,每個Kconfig分別描述了所屬目錄源文件相關(guān)的內(nèi)核配置菜單。在內(nèi)核配置make menuconfig(或xconfig等)時,從Kconfig中讀出菜單,用戶選擇后保存到.config的內(nèi)核配置文件中。在內(nèi)核編譯時,主Makefile調(diào)用這個.config,就知道了用戶的選擇。 *上面的內(nèi)容說明了,Kconfig就是對應(yīng)著內(nèi)核的配置菜單。如果要想添加新的驅(qū)動到內(nèi)核的源碼中,可以修改Kconfig,這樣就可以選擇這個驅(qū)動,如果想使這個驅(qū)動被編譯,要修改Makefile so添加新的驅(qū)動時需要修改的文件有兩種(注意不只是兩個) *Kconfig *Makefile 要想知道怎么修改這兩種文件,就要知道兩種文件的語法結(jié)構(gòu) 2. Kconfig ” 每個菜單都有一個關(guān)鍵字標(biāo)識,最常見的就是config 語法: config symbol是一個新的標(biāo)記的菜單項,options是在這個新的菜單項下的屬性和選項 其中options部分有: 1) 類型定義: 每個config菜單項都要有類型定義,bool布爾類型、 tristate三態(tài):內(nèi)建、模塊、移除 string字符串、 hex十六進制、 integer整型 例如config HELLO_MODULE bool "hello test module" bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成內(nèi)核模塊的選項,如果選擇編譯成內(nèi)核模塊,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置,如果選擇內(nèi)建,就會直接編譯成內(nèi),則在.config中生成一個CONFIG_HELLO_MODULE=y的配置. 2) 依賴型定義depends on或requires 指此菜單的出現(xiàn)與否依賴于另一個定義 config HELLO_MODULE bool "hello test module" depends on ARCH_PXA 這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效。 3) 幫助性定義 只是增加幫助用關(guān)鍵字help或者---help--- 3. 內(nèi)核的Makefile ” 在linux2.6.x/Documentation/kbuild目錄下有詳細(xì)的介紹有關(guān)kernel makefile的知識。 內(nèi)核的Makefile分為5個組成部分: Makefile 最頂層的Makefile .config 內(nèi)核的當(dāng)前配置文件,編譯時成為頂層Makefile的一部分 arch/$(ARCH)/Makefile 與體系結(jié)構(gòu)相關(guān)的Makefile s/ Makefile.* 一些Makefile的通用規(guī)則 kbuild Makefile 各級目錄下的大概約500個文件,編譯時根據(jù)上層Makefile傳下來的宏定義和其他編譯規(guī)則,將源代碼編譯成模塊或者編譯進內(nèi)核 頂層的Makefile文件讀取 .config文件的內(nèi)容,并總體上負(fù)責(zé)build內(nèi)核和模塊。Arch Makefile則提供補充體系結(jié)構(gòu)相關(guān)的信息。s目錄下的Makefile文件包含了所有用來根據(jù)kbuild Makefile 構(gòu)建內(nèi)核所需的定義和規(guī)則。其中.config的內(nèi)容是在make menuconfig的時候,通過Kconfig文件配置的結(jié)果。 舉個例子: 假設(shè)想把自己寫的一個flash的驅(qū)動程序加載到kernel中,而且能夠通過menuconfig配置內(nèi)核時選擇該驅(qū)動該怎么辦呢?可以分三步: “ 第一:將你寫的flashtest.c 文件添加到/driver/mtd/maps/ 目錄下。 第二:修改/driver/mtd/maps目錄下的kconfig文件: config MTD_flashtest tristate “ap71 flash" 這樣當(dāng)make menuconfig時 ,將會出現(xiàn) ap71 flash選項。 第三:修改該目錄下makefile文件。 添加如下內(nèi)容:obj-$(CONFIG_MTD_flashtest) += flashtest.o ” 這樣,當(dāng)你運行make menucofnig時,你將發(fā)現(xiàn)ap71 flash選項,如果你選擇了此項。該選擇就會保存在.config文件中。當(dāng)你編譯內(nèi)核時,將會讀取.config文件,當(dāng)發(fā)現(xiàn)ap71 flash 選項為yes 時,系統(tǒng)在調(diào)用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到內(nèi)核中。即可達到編譯的目的。 4. Linux下面如何將外部驅(qū)動代碼納入核心一起編譯 ” 1 ) 概述 某個功能或者設(shè)備驅(qū)動可以直接build-in內(nèi)核,也可以作為內(nèi)核模塊,在要用時再調(diào)入。這里假定寫作了一個鍵盤設(shè)備驅(qū)動,要將設(shè)備驅(qū)動代碼和內(nèi)核代碼集成,并可以在內(nèi)核編譯時將驅(qū)動編譯進內(nèi)核或者作為內(nèi)核模塊。 這里不對內(nèi)核編譯和模塊編譯的背景知識做詳細(xì)解釋,只是描敘過程。如果你對背景知識感興趣,請閱讀本文檔后面列出的參考文檔。 注意:Linux版本不同,內(nèi)核區(qū)別很大。 2 ) 具體步驟 2.1) 搭建linux編譯環(huán)境 我采用的是windowXP + VMware虛擬機 + Fedora1(安裝在虛擬機中)的環(huán)境,個人認(rèn)為此種方式效率比較高。安裝linux的時候注意要安裝kernel開發(fā)包和GCC開發(fā)包,如果空間足夠的話,還是建議以全部安裝方式安裝linux。 取得交叉編譯安裝包,例如cross-3.3.2.tar.bz2 將交叉編譯安裝包在/usr/local下面解壓:tar –jxvf cross-3.3.2.tar.bz2 解壓完成后生成arm-kernel目錄 取得arm的2.6內(nèi)核代碼,例如linux-hzh.tar.bz2 將內(nèi)核代碼在/root下面解壓:tar –jxvf linux-hzh.tar.bz2 解壓后生成linux-2.6.13-hzh目錄 將交叉編譯器的路徑加入環(huán)境變量,我是編輯/root/.bashrc,在最后加上一行 expot PATH=$PATH:/usr/local/arm-kernel/3.3.2/bin 完成后,登出用戶(logout命令),再登入一下,環(huán)境變量就生效了 2.2)修改配置文檔 2.2.1) 拷貝代碼 根據(jù)驅(qū)動的類型,將驅(qū)動代碼拷貝到內(nèi)核源代碼樹的相應(yīng)的驅(qū)動目錄 例如: 將鍵盤驅(qū)動keyscan64.c keyscan64.h 代碼拷貝到/root/linux-hzh/drivers/input/keyboard 2.2.2) 修改Kconfig配置文件 編輯/root/linux-hzh/drivers/input/keyboard目錄下面的Kconfig文件,加入新的鍵盤配置選項 ,例如: 添加 config MYKEYBOARD tristate "MY keyboard support" default y help The "MYKEYBOARD" is simple a scanable keyboard, Y for build in ,M for Module. 配置解釋: config MYKEYBOARD 上面的config是配置關(guān)鍵字,MYKEYBOARD表示新配置選項的標(biāo)識符 tristate "MY keyboard support" 中tristate表示是可以配置成Y,M,N三中情況 default y 配置默認(rèn)是什么選項 help The "MYKEYBOARD" is simple a scanable keyboard, Y for build in ,M for Module. 配置的幫助 2.2.3) 修改Makefile編譯文件 編輯/root/linux-2.6.13-hzh/drivers/input/keyboard目錄下面的Makefile文件,加入新的鍵盤編譯選項,例如 obj-$(CONFIG_MYKEYBOARD) += keyscan64.o 注意:Kconfig中的配置標(biāo)識符要和編譯選項中紅色標(biāo)識符一致,編譯的目標(biāo)keyscan64.o名稱要和源代碼的keyscan64.c名稱一致,這是系統(tǒng)強行規(guī)定的。 2.3) 編譯內(nèi)核 2.3.1) make clean 和普通的編譯內(nèi)核一樣 make clean 清除原先編譯過程文件 2.3.2) make menuconfig 文本菜單配置方式配置內(nèi)核選項 導(dǎo)入源代碼預(yù)配置的文件 配置新加入的驅(qū)動 新的配置選項在上圖中顯示出來了,可以配置成y(build in),m(module),n(不編譯),默認(rèn)是y,把它配置成M(module),然后退出,保存配置 2.3.3) make zImage 編譯內(nèi)核,生成內(nèi)核映像文件 2.3.4) make modules 編譯內(nèi)核模塊 2.4) 確認(rèn)結(jié)果 在目錄arch/arm/boot 下面可以看到新生成的zImage內(nèi)核映像文件 在目錄drivers/input/keyboard 下面可以看到鍵盤的內(nèi)核模塊keyscan64.ko 以下課程可免費試聽C語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費聽課了。 宋工企鵝號:3524-6590-88 Tel/WX:173--1795--1908 |