嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯
嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯
本文選擇linux 2.6.35.7版本kernel進行實踐。
一、linux kernel原始碼目錄分析
Kbuild,Kernel Build,管理核心編譯的檔案
Makefile,kernel工程的Makefile。
arch,體系架構,arch目錄下的子目錄存放的是不同種類的架構
block,塊裝置,一般是儲存裝置,存放的塊裝置管理的相關程式碼
crypto,加密相關,存放加密演算法實現程式碼
Documentation,說明文件
drivers,裝置驅動模組,存放各種裝置型別驅動模組
firmware,韌體
fs,檔案系統,子目錄存放各種檔案系統
include,標頭檔案,子目錄存放通用的各種模組的標頭檔案
init,kernel啟動時初始化的程式碼
ipc,程序間通訊機制的程式碼
kernel,kernel本身的程式碼
lib,通用的庫函式
mm,記憶體管理
net,網路協議棧,子目錄存放各種網路協議
scripts,輔助對kernel進行配置編譯的指令碼
security,kernel安全機制相關的程式碼
sound,音訊相關的程式碼
tools,工具相關
usr,kernel啟動相關
virt,虛擬機器相關
二、kernel的配置體系
Linux kernel的配置體系由三部分構成,分別是:
Makefile:分佈在 Linux 核心原始碼根目錄及各層目錄中,定義
Kconfig:配置選項的檔案,各個子目錄下的Kconfig定義了子目錄的功能模組的配置選項。
配置工具:配置命令直譯器(對配置指令碼中使用的配置命令進行解釋)和配置使用者介面(提供基於字元介面、基於Ncurses 圖形介面以及基於Xwindows圖形介面的使用者配置介面,各自對應於make config、make menuconfig和make xconfig)。通過對配置工具選項進行配置後生成配置檔案.config,.config檔案決定Kconfig
1、工程Makefile的修改
ARCH?= arm
CROSS_COMPILE?= arm-linux-
2、配置檔案.config檔案的生成
A、預設配置檔案的載入:
make xxx_defconfig:
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/basic/hash
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
arch\arm\configs目錄下的相應開發板的xxxx_defconfig檔案
3、配置工具的使用
A、配置工具的使用方式
make config(基於文字的最為傳統的配置介面,不推薦使用)
make menuconfig (基於文字選單的配置介面,需要安裝ncurse)
make xconfig (基於QT的圖形配置介面,要求QT被安裝)
make gconfig (基於GTK+的圖形配置介面,要求GTK+被安裝)
make oldconfig (以現有的.config檔案為基礎來更新當前配置)
make silentoldconfig (與oldconfig相同,但不輸出任何資訊)
make randconfig (建立新的配置檔案,其中包括所有配置選項的隨機答案)
make defconfig (建立新的配置檔案,其中包括所有配置選項的預設答案)
make allmodconfig (建立新的配置檔案,儘可能地將選項配置成預設模組)
make allyesconfig (建立新的配置檔案,將所有選項配置成yes)
make allnoconfig (建立新的配置檔案,將所有選項配置成no,即最小化的配置)
以上make xxconfig使用方式中make menuconfig最為常用,使用說明如下:
make menuconfig:
scripts資料夾存放的是跟make menuconfig配置介面的圖形繪製相關的檔案,執行make menuconfig命令出時:
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTCC scripts/kconfig/mconf.o
HOSTLD scripts/kconfig/mconf
scripts/kconfig/mconf arch/arm/Kconfig
mconf表示是menuconfig的解析程式,mconf解析處理arch/arm/Kconfig檔案,最終mconf會把使用者的選擇儲存到Linux原始碼樹頂層目錄的.config檔案中。
xxconfig檔案實際是開發板廠商移植的kernel的推薦配置,實際開發中可以根據開發板廠商提供的kernel的xxconfig結合產品需求進行剪裁配置,得到需要的kernel配置,即通過make menuconfig進行配置裁剪。
arch\arm\Kconfig用於生成整個配置介面選項(Kconfig是整個linux配置機制的核心),是配置介面的主選單介面,經過設定、修改的選項的選擇結果儲存在根目錄下的.config檔案中。退出時,menuconfig會檢查是否修改了配置選項,如果修改了配置選項會提示儲存,否則會直接退出。儲存時會將修改過的配置選項寫入.config檔案中。
B、Kconfig檔案配置項的格式
menu/endmenu:可以將一部分配置選項分類為一個目錄menu,menu與endmenu是一組指令,必須同時使用。menu和endmenu中包含的部分就是子目錄中的配置項。
menuconfig:menuconfig是可以配置的目錄menu,即可以修改menu選中或排除
config:config是構建Kconfig的基本單元,config的型別有5種,分別是bool(y/n),tristate(y/m/n),string(字串),hex(十六進 制),integer(整數)。
tristate三種選項配置
bool兩種選項配置
depends on/requires依賴於的配置項,如果依賴的配置選項沒有選中,則當前選項也無法選中
---help---help資訊
select反向依賴配置選項,如果當前選項選中,則也會自動選中select後的選項。
default選項預設值,可以有多個,但只有第一個定義的值有效
range:範圍,用於hex和integer,range A B表示當前值不小於A,不大於B
comment:註釋
choice/endchoice:多選一
source:將子目錄的Kconfig引入到當前位置
C、Kconfig檔案新增功能選項例項
menuconfig:
menuconfig NETDEVICES
default y if UML
depends on NET
bool "Network device support"
---help---
You can say N here if you don't intend to connect your Linux box to
any other computer at all.
menuconfig NETDEVICES表明選單目錄是可以修改配置的,並且選單錄有子目錄,選單選項在.config檔案的選項為CONFIG_NETDEVICES,bool "Network device support"表明選單目錄的提示符是"Network device support"。depends on NET表名選單目錄依賴於NET選項。
選單目錄的子目錄選項需要放在以下定義的範圍內:
if NETDEVICES
......
子目錄選單選項
endif # NETDEVICES
menu:
if WIMAX
menu "WiMAX Wireless Broadband devices"
source "drivers/net/wimax/i2400m/Kconfig"
endmenu
endif
menu "WiMAX Wireless Broadband devices”表明選單目錄不具備修改屬性,但具有子目錄選單,選單提示符為"WiMAX Wireless Broadband devices”。子選單的Kconfig來源source "drivers/net/wimax/i2400m/Kconfig"。if WIMAX表明選單依賴於WIMAX選項。
D、make menuconfig使用
按Enter鍵進入子目錄
按Y鍵選中當前選項
按N鍵排除當前選項
按M鍵將當前模組進行模組化編譯
按ESC ESC將退出當前選項返回上一層目錄
按?將顯示當前選項的help資訊
方向箭頭可以將游標向上下左右移動
[*]:選中
[ ]:排除
< >:可以模組化編譯
<M>:模組化編譯
make menuconfig對目錄樹下Kconfig檔案選項配置後選項的結果儲存在.config檔案中,檔案內容如下:
CONFIG_ARM=y
CONFIG_HAVE_PWM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y
CONFIG_GENERIC_TIME=y
CONFIG_ARCH_USES_GETTIMEOFFSET=y
.config檔案中的選項的值將與目錄樹下Makefile檔案結合,確保配置選中的功能模組選項會被編譯,未被選中的不會被編譯,以及功能模組是被編譯進核心還是編譯成模組.ko檔案。
三、配置項新增例項
給核心增加一個功能,並且通過make menuconfig控制其生成過程,流程如下:
A、修改對應目錄下的Kconfig檔案,按照Kconfig語法增加對應的選項;
B、執行make menuconfig選擇編譯進核心或者不編譯進核心,或者編譯為模組,.config檔案和autoconf.h檔案會自動生成
C、修改對應目錄下的Makefile檔案完成編譯選項的新增
D、編譯核心make -j4
在drivers\net目錄下新增TFTP的功能模組,流程如下:
1、修改drivers\net目錄下的Kconfig檔案,在網路裝置支援程式碼塊NETDEVICES內部新增TFTP的配置選項:
config TFTP
tristate "TFTP support"
depends on NET_CLS_ACT
---help---
This is an TFTP.
2、執行make menuconfig,將TFTP功能編譯為模組
檢視.config檔案可知,CONFIG_TFTP定義在網路裝置支援選項CONFIG_NETDEVICES後,以模組編譯。
CONFIG_NETDEVICES=y
CONFIG_TFTP=m
3、修改drivers\net目錄下Makefile檔案
新增編譯目標
obj-$(CONFIG_TFTP) +=tftp.o
4、編譯kernel
make -j4
四、kernel編譯
Kernel的配置編譯過程如下:
make xxx_defconfig//生成.config檔案
make memuconfig//修改配置選項
make -j2//編譯
本文出自 “生命不息,奮鬥不止” 部落格,轉載請與作者聯絡!