歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> .config 文件和Linux系統的關聯

.config 文件和Linux系統的關聯

日期:2017/3/1 10:12:47   编辑:Linux編程

Kconfig文件的作用
內核源碼樹的目錄下都有兩個文件Kconfig(2.4版本是Config.in)和Makefile。分布到各目錄的Kconfig構成了一個分布式的內核配置數據庫,每個Kconfig分別描述了所屬目錄源文件相關的內核配置菜單。在內核配置make menuconfig(或xconfig等)時,從Kconfig中讀出菜單,用戶選擇後保存到.config的內核配置文件中。在內核編譯時,主Makefile調用這個.config,就知道了用戶的選擇。
*上面的內容說明了,Kconfig就是對應著內核的配置菜單。如果要想添加新的驅動到內核的源碼中,可以修改Kconfig,這樣就可以選擇這個驅動,如果想使這個驅動被編譯,要修改Makefile
so添加新的驅動時需要修改的文件有兩種(注意不只是兩個)
*Kconfig
*Makefile
要想知道怎麼修改這兩種文件,就要知道兩種文件的語法結構
Kconfig
每個菜單都有一個關鍵字標識,最常見的就是config
語法:
config
symbol是一個新的標記的菜單項,options是在這個新的菜單項下的屬性和選項
其中options部分有:
1、類型定義:
每個config菜單項都要有類型定義,bool布爾類型、 tristate三態:內建、模塊、移除 string字符串、 hex十六進制、 integer整型
例如config HELLO_MODULE
bool "hello test module"
bool類型的只能選中或不選中,tristate類型的菜單項多了編譯成內核模塊的選項,如果選擇編譯成內核模塊,則會在.config中生成一個CONFIG_HELLO_MODULE=m的配置,如果選擇內建,就是直接編譯成內核影響,就會在.config中生成一個CONFIG_HELLO_MODULE=y的配置.
2、依賴型定義depends on或requires
指此菜單的出現與否依賴於另一個定義
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
這個例子表明HELLO_MODULE這個菜單項只對XScale處理器有效。
3、幫助性定義
只是增加幫助用關鍵字help或者---help---
內核的Makefile

在linux2.6.x/Documentation/kbuild目錄下有詳細的介紹有關kernel makefile的知識。
內核的Makefile分為5個組成部分:
Makefile 最頂層的Makefile
.config 內核的當前配置文件,編譯時成為定層Makefile的一部分
arch/$(ARCH)/Makefile 與體系結構相關的Makefile
s/ Makefile.* 一些Makefile的通用規則
kbuild Makefile 各級目錄下的大概約500個文件,編譯時根據上層Makefile傳下來的宏定義和其他編譯規則,將源代碼編譯成模塊或者編入內核
頂層的Makefile文件讀取 .config文件的內容,並總體上負責build內核和模塊。Arch Makefile則提供補充體系結構相關的信息。 s目錄下的Makefile文件包含了所有用來根據kbuild Makefile 構建內核所需的定義和規則。
(其中.config的內容是在make menuconfig的時候,通過Kconfig文件配置的結果。
舉個例子:
假設想把自己寫的一個flash的驅動程序加載到工程中,而且能夠通過menuconfig配置內核時選擇該驅動該怎麼辦呢?可以分三步:
第一:將你寫的flashtest.c 文件添加到/driver/mtd/maps/ 目錄下。
第二:修改/driver/mtd/maps目錄下的kconfig文件:
config MTD_flashtest
tristate “ap71 flash"
這樣當make menuconfig時 ,將會出現 ap71 flash選項。
第三:修改該目錄下makefile文件。
ü 添加如下內容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
這樣,當你運行make menucofnig時,你將發現ap71 flash選項,如果你選擇了此項。該選擇就會保存在.config文件中。當你編譯內核時,將會讀取.config文件,當發現ap71 flash 選項為yes 時,系統在調用/driver/mtd/maps/下的makefile 時,將會把 flashtest.o 加入到內核中。即可達到你的目的


Linux下面如何將外部驅動代碼納入核心一起編譯
1 概述

某個功能或者設備驅動可以直接build-in內核,也可以作為內核模塊,在要用時再調入。本文檔假定寫作了一個鍵盤設備驅動,要將設備驅動代碼和內核代碼集成,並可以在內核編譯時將驅動編譯進內核或者作為內核模塊。

本文不對內核編譯和模塊編譯的背景知識做詳細解釋,只是描敘過程。如果你對背景知識感興趣,請閱讀本文檔後面列出的參考文檔。

2.4內核和2.6內核是當前用的兩大系列內核版本,由於新的產品是基於2.6,故本文檔只說明在2.6內核下的方法。注意:2.4 和2.6 區別很大,兩者方法不同。


2 具體步驟
2.1 搭建linux編譯環境

我采用的是windowXP + VMware虛擬機 + Fedora1(安裝在虛擬機中)的環境,個人認為此種方式效率比較高。安裝linux的時候注意要安裝kernel開發包和GCC開發包,如果空間足夠的話,還是建議以全部安裝方式安裝linux。

取得交叉編譯安裝包,例如cross-3.3.2.tar.bz2

將交叉編譯安裝包在/usr/local下面解壓:tar –jxvf cross-3.3.2.tar.bz2

解壓完成後生成arm-kernel目錄

取得arm的2.6內核代碼,例如linux-2.6.13-hzh.tar.bz2

將內核代碼在/root下面解壓:tar –jxvf linux-2.6.13-hzh.tar.bz2

解壓後生成linux-2.6.13-hzh目錄

將交叉編譯器的路徑加入環境變量,我是編輯/root/.bashrc,在最後加上一行

expot PATH=$PATH:/usr/local/arm-kernel/3.3.2/bin

完成後,登出用戶(logout命令),再登入一下,環境變量就生效了


2.2 修改配置文檔
2.2.1 拷貝代碼

根據驅動的類型,將驅動代碼拷貝到內核源代碼樹的相應的驅動目錄

例如:

將鍵盤驅動keyscan64.c keyscan64.h 代碼拷貝到/root/linux-2.6.13-hzh/drivers/input/keyboard


2.2.2 修改Kconfig配置文件

編輯/root/linux-2.6.13-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是配置關鍵字,MYKEYBOARD表示新配置選項的標識符

tristate "MY keyboard support"

中tristate表示是可以配置成Y,M,N三中情況

default y

配置默認是什麼選項

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中的配置標識符要和編譯選項中紅色標識符一致,編譯的目標keyscan64.o名稱要和源代碼的keyscan64.c名稱一致,這是系統強行規定的。


2.3 編譯內核
2.3.1 make clean

和普通的編譯內核一樣

make clean

清除原先編譯過程文件


2.3.2 make menuconfig

文本菜單配置方式配置內核選項
導入源代碼預配置的文件

配置新加入的驅動

新的配置選項在上圖中顯示出來了,可以配置成y(build in),m(module),n(不編譯),默認是y,把它配置成M(module),然後退出,保存配置
2.3.3 make zImage

編譯內核,生成內核映像文件


2.3.4 make modules

編譯內核模塊


2.4 確認結果

在目錄arch/arm/boot 下面可以看到新生成的zImage內核映像文件

在目錄drivers/input/keyboard 下面可以看到鍵盤的內核模塊keyscan64.ko

Copyright © Linux教程網 All Rights Reserved