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 menuconfigd、編譯
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條目定義的配置選項。