linux內核的配置機制及其編譯過程
國嵌第一天第三節:講解的是內核在X86平台上的配置、安裝過程,制作自己的Linux系統,並雙系統啟動。
《Linux系統移植》第四章
http://blog.csdn.net/zhengmeifu/article/details/7682373
Linux內核具有可定制的特點,具體步驟如下:
1.1.1 配置系統的基本結構
Linux內核的配置系統由三個部分組成,分別是:
1、Makefile:分布在 Linux 內核源代碼根目錄及各層目錄中,定義 Linux 內核的編譯規則;
2、配置文件(config.in(2.4內核,2.6內核)):給用戶提供配置選擇的功能;
3、配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基於字符界面、基於Ncurses圖形界面以及基於Xwindows圖形界面的用戶配置界面,各自對應於Make config、Make menuconfig和make xconfig)。
這些配置工具都是使用腳本語言,如Tcl/TK、Perl編寫的(也包含一些用C編寫的代碼)。本文並不是對配置系統本身進行分析,而是介紹如何使用配置系統。所以,除非是配置系統的維護者,一般的內核開發者無須了解它們的原理,只需要知道如何編寫Makefile和配置文件就可以。
1.1.2 清除臨時文件、中間文件和配置文件.
l make clean
remove most generated files but keep the config
僅僅刪除生成的 .o 文件保留配置
l make mrproper
remove all generated files + config files
l make distclean
Mrproper + remove editor backup and patch files
確定目標系統的軟硬件配置情況,比如CPU的類型、網卡的型號,所需支持的網絡協議等。
1.1.3 使用如下命令配置內核:
a) make config:基於文本模式的交互式配置。
b) make menuconfig:基於文本模式的菜單型配置。(推薦使用)
c) make oldconfig:使用已有的配置文件(.config),但是會詢問新增的配置選項。
d) make xconfig:圖形化的配置(需安裝圖形化系統)。
make menuconfig 是最為常用的內核配置方式,使用方法如下:
1、使用方向鍵在各選項間移動;
2、使用“Enter”鍵進入下一層選單;每個選項上的高亮字母是鍵盤快捷方式,使用它可以快速地到達想要設置的選單項。
3、在括號中按“y”將這個項目編譯進內核中,按“m”編譯為模塊,按“n”為不選擇(按空格鍵也可在編譯進內核、編譯為模塊和不編譯三者間進行切換),按“h”將顯示這個選項的幫助信息,按“Esc”鍵將返回到上層選單。
操作:官網下載內核 https://www.kernel.org/ linux-2.6.29
該命令一定要在內核的根目錄下進行,../../linux-x.x.x
[root@embedclub linux-2.6.29]# make distclean
清除以往編譯的所有文件,下面進行內核操作,可以用文本的顯示,也可以以菜單顯示。
[root@embedclub linux-2.6.29]# make menuconfig
可能出現以下錯誤1:
//Your display is too small to run Menuconfig!
//It must be at least 19 lines by 80 columns.
//make[1]: *** [menuconfig] 錯誤 1
//make: *** [menuconfig] 錯誤 2
原因:終端窗口太小,最大化即可解決。
可能出現以下錯誤2:
***Unable to find the ncurses libraries or the ***required header files. ***make menuconfig'requires the ncurses libraries. ***Install ncurses(ncurses-devel)and try again. make[1]:***[scripts/kconfig/dochecklxdialog]錯誤1 make:***[menuconfig]錯誤2
解決辦法:Installing ncurses-devel
輸入命令:
sudo apt-get install ncurses-dev
問題解決后彈出內核配置框。點擊空格可以改變選擇。
使用方法:
在括號中按“y”將這個項目編譯進內核中,按“m”編譯為模塊,按“n”為不選擇(按空格鍵也可在編譯進內核、編譯為模塊和不編譯三者間進行切換),按“h”將顯示這個選項的幫助信息,按“Esc”鍵將返到上層選單選擇Y(即*)相應的A.c文件變為A.o並最終鏈接生成到uImage(內核)中,選擇M后相應的A.c變為A.o模塊。
不進行任何操作,保存內核退出,輸入ls -a(-a顯示隱藏文件)命令顯示多了.config文件,這就是我們配置的結果。
[root@embedclub linux-2.6.29]# ls -a
接下來就可以進行配置了,那么如何進行配置菜單的選擇呢?
1.1.4 makefile menuconfig過程講解
當我們在執行make menuconfig這個命令時,系統到底幫我們做了哪些工作呢?
這里面一共涉及到了一下幾個文件我們來一一講解
Ø Linux內核根目錄下的scripts文件夾
Ø arch/$ARCH/Kconfig文件、各層目錄下的Kconfig文件
Ø Linux內核根目錄下的makefile文件、各層目錄下的makefile文件
Ø Linux內核根目錄下的的.config文件、arm/$ARCH/下的config文件
Ø Linux內核根目錄下的 include/generated/autoconf.h文件
整體流程:make menuconfig----make zImage(生成zImage) ---- make modules ----make modules_install----init ramdisk
1)scripts文件夾存放的是跟make menuconfig配置界面的圖形繪制相關的文件,我們作為使用者無需關心這個文件夾的內容
2)當我們執行make menuconfig命令出現上述藍色配置界面以前,系統幫我們做了以下工作:
首先系統會讀取arch/$ARCH/目錄下的Kconfig文件生成整個配置界面選項(Kconfig是整個linux配置機制的核心),那么ARCH環境變量的值等於多少呢?
它是由linux內核根目錄下的makefile文件決定的,在makefile下有此環境變量的定義:
或者通過make ARCH=arm menuconfig命令來生成配置界面,默認生成的界面是所有參數都是沒有值的。
比如教務處進行考試,考試科數可能有外語、語文、數學等科,這里相當於我們選擇了arm科可進行考試,系統就會讀取arm/arm/kconfig文件生成配置選項(選擇了arm科的卷子),系統還提供了x86科、milps科等10幾門功課的考試題。
3)菜單配置比較麻煩,內核配置通常在一個已有的配置文件基礎上,通過修改得到新的配置文件Linux內核提供了一系列可供參考的內核配置文件,位於/linux-2.6.28-omap/Arch/$arm/configs
假設教務處比較“仁慈”,為了怕某些同學做不錯試題,還給我們准備了一份參考答案(默認配置選項),存放在arch/$ARCH/configs下,對於arm科來說就是arch/arm/configs文件夾:
此文件夾中有許多選項,系統會讀取哪個呢?內核默認會讀取linux內核根目錄下.config文件作為內核的默認選項(試題的參考答案),我們一般會根據開發板的類型從中選取一個與我們開發板最接近的系列到Linux內核根目錄下(選擇一個最接近的參考答案)。
#根目錄下操作
#cp arch/arm/configs/s3c2410_defconfig .config
4).config
假設教務處留了一個心眼,他提供的參考答案並不完全正確(.config文件與我們的板子並不是完全匹配),這時我們可以選擇直接修改.config文件然后執行make menuconfig命令讀取新的選項
但是一般我們不采取這個方案,我們選擇在配置界面中通過空格、esc、回車選擇某些選項選中或者不選中,最后保存退出的時候,Linux內核會把新的選項(正確的參考答案)更新到.config中,此時我們可以把.config重命名為其它文件保存起來(當你執行make distclean時系統會把.config文件刪除),以后我們再配置內核時就不需要再去arch/arm/configs下考取相應的文件了,省去了重新配置的麻煩,直接將保存的.config文件復制為.config即可.
5)經過以上兩步,我們可以正確的讀取、配置我們需要的界面了
那么他們如何跟makefile文件建立編譯關系呢?
當你保存make menuconfig選項時,系統會除了會自動更新.config外,還會將所有的選項以宏的形式保存在
Linux內核根目錄下的include/generated/autoconf.h文件下
內核中的源代碼就都會包含以上.h文件,跟宏的定義情況進行條件編譯。
當我們需要對一個文件整體選擇如是否編譯時,還需要修改對應的makefile文件,例如:
我們選擇是否要編譯s3c2410_ts.c這個文件時,makefile會根據CONFIG_TOUCHSCREEN_S3C2410來決定是編譯此文件,此宏是在Kconfig文件中定義,當我們配置完成后,會出現在.config及autconf中,至此,我們就完成了整個linux內核的編譯過程。
最后我們會發現,整個linux內核配置過程中,留給用戶的接口其實只有各層Kconfig、makefile文件以及對應的源文件。
比如我們如果想要給內核增加一個功能,並且通過make menuconfig控制其聲稱過程。
首先需要做的工作是:修改對應目錄下的Kconfig文件,按照Kconfig語法增加對應的選項;
其次執行make menuconfig選擇編譯進內核或者不編譯進內核,或者編譯為模塊,.config文件和autoconf.h文件會自動生成;
最后修改對應目錄下的makefile文件完成編譯選項的添加;
最后的最后執行make bzImage命令進行編譯。
1.2 內核配置選項說明
因s6410和6400的資源差不多,主頻和外設有點差別,故在board/samsung/下建立自己開發板的項目,取名叫smdk6410。並將smdk6400里的所有文件復制到smdk6410中,進入smdk6410文件夾將smdk6400.c更名為smdk6410.c,並且打開此文件,將里面的6400全部改為6410。打開Makfile,將里面的6400改為6410。