1. 程式人生 > >Exynos4412 核心移植(一)—— 核心配置過程分析

Exynos4412 核心移植(一)—— 核心配置過程分析

一、前言

1、linux核心五大功能:

程序管理(cpu)  
記憶體管理(記憶體)
裝置管理(驅動)
網路管理(網路協議tcp/ip)
檔案系統(vfs)

2、linux版本號:

linux 2.6  2--->主版本號  6---->次版本號:奇數代表測試版本 偶數代表穩定版本

本文使用核心版本為linux3.14

3、linux目錄結構:

arch:體系結構相關程式碼
ipc:程序排程相關程式碼
mm:記憶體管理
Documentation:幫助文件
net:網路協議
lib:庫
scripts:編譯相關指令碼工具
tools:編譯相關工具
drivers:裝置驅動
fs:檔案系統實現


4、編譯相關檔案:

頂層Makefile 與 子目錄下的Makefile
各級目錄Kconfig

5、核心的使用流程

a、清除命令

一般在第一次編譯時使用

make mrproper 

b、匯入預設配置資訊(在核心根目錄中)

方法1:make exynos_deconfig

方法2:cp  arch/arm/configs/exynos_deconfig  .config

c、詳細配置

make menuconfig

d、編譯

make uImage ---生成核心映象  /arch/arm/boot/uImag

make dtbs ---生成裝置樹檔案  /arch/arm/boot/dtb/exynos4412-fs4412.dtb

make modules ---把配置值選成M的程式碼編譯生成模組檔案。(.ko)  放在對應的原始碼目錄下。

可以看出,核心編譯主要包括兩部分:一部分是核心配置;另一部分是核心編譯;我們先從核心配置開始:

二、核心的Kconfig分析

a -- 我們解壓核心後需要先修改核心頂層目錄下的Makefile,配置好交叉編譯工具


b -- 然後匯入預設配置(使用make exynis_defconfig 或者cp  arch/arm/configs/exynos_deconfig  .config


可以看到該命令會將 配置資訊寫入 .config 中,.config 是核心根目錄下的隱藏檔案,makefile 會根據它裡面的內容進行編譯,具體的使用我們後面會講到,可以簡單看一下里面的內容。 


c -- 配置核心

使用 make menuconfig 命令進行核心配置(視窗太小打不開,視窗要19行 80列),可能會出現下面的報錯:


使用 sudo apt-get install libncurses5-dev命令安裝一下接可以了,安裝以後再使用 make menuconfig,便可以看到下面的介面了。


   如上圖所示,這就是核心的配置介面。通過配置介面,可以選擇晶片型別、選擇需要支援的檔案系統。去除不需要的選項等,這就稱為“配置核心”。注意,也有其他形式的配置介面,比如“make config”命令啟動字元配置介面,對於每個選項都會依次出現一行提示資訊,組個回答;“make xconfig”命令啟動 X-Windows 圖形配置介面

   所有配置工具都是讀取arch/$(ARCH)/Kconnfig 檔案來生成配置介面,這個檔案是所有配置檔案的總入口,它會包含其他目錄的Kconfig檔案。配置介面如上圖所示。

   核心原始碼每個子目錄中,都有一個Makefile檔案和Kconfig檔案。Makefile的作用下篇文章會講述Kconfig用於配置核心,它就是各種配置介面的原始檔。核心的配置工具讀取各個Kconfig檔案,生成配置介面供開發人員配置核心最後生成配置檔案.config

   核心的配置介面以樹狀的選單形式組織,主選單下有若干子選單,子選單下又有子選單或配置選項。每個子選單或選項都有依賴關係,這些依賴關係用來確定它們是否顯示。只有被依賴的父項已經被選中,子項才會顯示。

下面學習Kconfig檔案的簡單語法:

1、Kconfig 檔案的基本要素:config 條目(entry)

  config 條目常被其他條目包含,用來生成選單,進行多項選擇等。

  config 條目用來配置一個選項,或者這麼說,它用於生成一個變數,這個變數會連同它的值一起被寫入配置檔案 .config 中。比如有一個config 條目用來配置CONFIG_LEDS_FS4412,根據使用者的選擇,.config檔案中可能出現下面3種配置結果中的一個。

CONFIG_LEDS_FS4412=y   # 對應的檔案被編進核心

CONFIG_LEDS_FS4412=m   # 對應的檔案被編成模組

#CONFIG_LEDS_FS4412   # 對應的檔案沒有被使用

以一個例子說明config條目格式,下面程式碼選自 drviers/char/Kconfig 檔案,它用於配置CONFIG_TTY_PRINTK選項

程式碼中包含了大部分元素,下面一一說明。

第42行,config是關鍵字,便是一個配置選項的開始;緊跟著的TTY_PRINTK是配置選項的名稱,省略了字首“CONFIG_”。

第43行boot表示變數型別,即CONFIG_TTY_PRINTK的型別,有五種型別:

Bool  布林型別,結果是Y[*] ,  N[]
Tristate 三項選擇,結果是Y[*], N[], M[m]

String  字串, 結果(arm-linux-)
Hex   十六進位制,(16)
Int   十進位制,(10)

"bool" 之後的字串提示資訊,在配置介面中上下移動游標選中它時,可以通過按空格或回車鍵來設定CONFIG_TTY_PRINTK的值。

第44行,表示依賴關係,格式如下。只有EXPERT && TTY 配置選項被選中時,當前配置選項的提示資訊才會出現,才能設定當前配置選項。注意,如果依賴條件不滿足,則它取預設值。

第45行表示預設值為n;

第46行表示下面幾行是幫助資訊;

2、menu 條

menu條目用於生成選單, 在menuconfig 中是以------>形式出現 格式如下:

“menu” <prompt>

<menu options>

<menu block>

"endmenu"

它的實際使用並不如它的標準格式那樣複雜,下面是一個例子

menu之後字串是選單名,“menu”和“endmunu”之間有很多config條目。在配置介面上回出現如下字樣的選單,移動游標選中它後按回車鍵進入,就會看到這些config條目定義的配置選項。

3、Source條目

xx/kconfig :當前Kconfig可以包含其它目錄下的kconfig,用於讀入另一個Kconfig檔案,格式如下:

“source” <prompt>

下面是一個例子,取自arch/arm/Kconfig檔案,它讀入arch/arm/mach-mvebu/Kconfig檔案

4、Choice

choice條目將多個類似的配置選項組合在一起,供使用者單選或多選,格式如下:

“choice”

<choice options>

<choice block>

"end choice"

實際使用中,也是在“choice”和“endchoice”之間定義多個config條目,比如arcg/arm/Kconfig中有如下程式碼:


prompt “Memory split”給出提示資訊“Memory split",游標選中它後按回車鍵進入,就可以看到多個config條目定義的配置選項。