1. 程式人生 > >嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯

嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯

嵌入式 Linux開發Kernel移植(二)——kernel核心配置和編譯

    本文選擇linux 2.6.35.7版本kernel進行實踐。

一、linux kernel原始碼目錄分析

KbuildKernel Build,管理核心編譯的檔案

Makefilekernel工程的Makefile

arch,體系架構,arch目錄下的子目錄存放的是不同種類的架構

block,塊裝置,一般是儲存裝置,存放的塊裝置管理的相關程式碼

crypto,加密相關,存放加密演算法實現程式碼

Documentation,說明文件

drivers,裝置驅動模組,存放各種裝置型別驅動模組

firmware,韌體

fs,檔案系統,子目錄存放各種檔案系統

include,標頭檔案,子目錄存放通用的各種模組的標頭檔案

initkernel啟動時初始化的程式碼

ipc,程序間通訊機制的程式碼

kernelkernel本身的程式碼

lib,通用的庫函式

mm,記憶體管理

net,網路協議棧,子目錄存放各種網路協議

scripts,輔助對kernel進行配置編譯的指令碼

securitykernel安全機制相關的程式碼

sound,音訊相關的程式碼

tools,工具相關

usrkernel啟動相關

virt,虛擬機器相關

二、kernel的配置體系

    Linux kernel的配置體系由三部分構成,分別是:

    Makefile分佈在 Linux 核心原始碼根目錄及各層目錄中,定義

Linux kernel的編譯規則,依據.config中定義的CONFIG_xxxx=xxxxx確定xxx以何種方式編譯進kernel

    Kconfig:配置選項的檔案,各個子目錄下的Kconfig定義了子目錄的功能模組的配置選項。

    配置工具:配置命令直譯器(對配置指令碼中使用的配置命令進行解釋)和配置使用者介面(提供基於字元介面、基於Ncurses 圖形介面以及基於Xwindows圖形介面的使用者配置介面,各自對應於make configmake menuconfigmake xconfig。通過對配置工具選項進行配置後生成配置檔案.config.config檔案決定Kconfig

中的配置項是否編譯進入kernel

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的推薦配置,實際開發中可以根據開發板廠商提供的kernelxxconfig結合產品需求進行剪裁配置,得到需要的kernel配置,即通過make menuconfig進行配置裁剪。

arch\arm\Kconfig用於生成整個配置介面選項Kconfig是整個linux配置機制的核心),是配置介面的主選單介面,經過設定、修改的選項的選擇結果儲存在根目錄下的.config檔案中。退出時,menuconfig會檢查是否修改了配置選項,如果修改了配置選項會提示儲存,否則會直接退出。儲存時會將修改過的配置選項寫入.config檔案中。

    BKconfig檔案配置項的格式

menu/endmenu:可以將一部分配置選項分類為一個目錄menumenuendmenu是一組指令,必須同時使用menuendmenu中包含的部分就是子目錄中的配置項。

menuconfigmenuconfig是可以配置的目錄menu,即可以修改menu選中或排除

configconfig是構建Kconfig的基本單元,config的型別有5種,分別是bool(y/n)tristate(y/m/n)string(字串)hex(十六進 制)integer(整數)

tristate三種選項配置

bool兩種選項配置

depends on/requires依賴於的配置項,如果依賴的配置選項沒有選中,則當前選項也無法選中

---help---help資訊

select反向依賴配置選項,如果當前選項選中,則也會自動選中select後的選項。

default選項預設值,可以有多個,但只有第一個定義的值有效

range:範圍,用於hexintegerrange A B表示當前值不小於A,不大於B

comment:註釋

choice/endchoice多選一

source:將子目錄的Kconfig引入到當前位置

    CKconfig檔案新增功能選項例項

    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.

wKiom1dzKEzj0MlxAABDE72h2mg589.png

    menuconfig NETDEVICES表明選單目錄是可以修改配置的,並且選單錄有子目錄,選單選項在.config檔案的選項為CONFIG_NETDEVICESbool "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選項。

wKioL1dzKHPjVPKsAABH5w8O6rM390.png

Dmake 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功能編譯為模組

wKioL1dzKJryVmI6AABT3dpoOyA997.png

    檢視.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//編譯

本文出自 “生命不息,奮鬥不止” 部落格,轉載請與作者聯絡!