摘要:本文主要介紹了嵌入式Linux內核以及在ARM平臺下的編譯與移植過程。
關鍵字:Linux 內核;移植;編譯
中圖分類號:TP311 文獻標識碼:A文章編號:1009-3044(2008)15-20000-00
Compile And Transplant The Embedded Linux Kernel Based on ARM2410
ZOU Qiu
(Computer Dept., Nanbo Polytechnic, Dongguan 523083, China)
Abstract:This paper mainly introduces the Embedded linux kernel’s Compilation and transplantation at the platform of ARM.
Key words:Linux kernel;transplant;compile
1 Linux內核簡介
Linux內核,是Linux操作系統的核心。它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。
嵌入式linux內核指的是針對具體的嵌入式設備硬件平臺,裁減掉一些不必要的功能后,針對該具體的硬件平臺編譯產生的一個Linux內核。嵌入式Linux通常都需要裁減,主要目的是節省系統資源,提高系統運行效率。同時嵌入式Linux作為一種嵌入式操作系統有其得天獨厚的優勢,主要表現在:
首先,Linux是開放源代碼的,所有的內核源程序都可以在 /usr/src/linux下找到,大部分應用軟件也都是遵循GPL而設計,遍布全球的眾多Linux愛好者又是Linux開發者的強大技術支持;
其次,Linux的內核小、效率高,內核的更新速度很快;
再次,Linux是免費的操作系統,在價格上極具競爭力。
2 Linux內核移植準備
所謂Linux移植就是把Linux操作系統針對具體的目標平臺做必要改寫之后,安裝到該目標平臺使其正確的運行起來。這個概念目前在嵌入式開發領域講的比較多。其基本內容是:獲取某一版本的Linux內核源碼,根據我們的具體目標平臺對這源碼進行必要的改寫(主要是修改體系結構相關部分),然后添加一些外設的驅動,打造一款適合于我們目標平臺(可以是嵌入式便攜設備也可以是其它體系結構的PC機)的新操作系統,對該系統進行針對我們目標平臺的交叉編譯,生成一個內核映象文件,最后通過一些手段把該映象文件燒寫(安裝)到我們目標平臺中。而通常對Linux源碼的改寫工作難度較大,它要求你不僅對Linux內核結構要非常熟悉,還要求你對目標平臺的硬件結構要非常熟悉。所以這部分工作一般由目標平臺提供商來完成。我們所要做的就是從其網站上下載相關版本Linux內核的補丁(Patch),把它打到我們的Linux內核上,再進行交叉編譯就可以。
其基本過程如下(以Linux2.6.24為例):
到ftp://ftp.arm.linux.org.uk/pub/linux/linux-2.6/上下載Linux2.6.24內核及其關于ARM平臺的補丁(如:Patch-2.6.24.gz)。給Linux2.6.24打補丁:使用命令zcat ../patch-2.6.24.gz | patch –p1(前面../表示補丁文件放在內核文件上一層目錄),
然后準備交叉編譯環境:交叉編譯環境工具鏈一般包括binutils(含AS匯編器,LD鏈接器等),arm-gcc,glibc等。
接下來修改內核目錄下的makefile文件,主要是以下幾行:
注釋掉ARCH:=$(shell uname –m | sed –e s/i.86/i386/-e s/sun4u/sparc64/ -e s/arm. \\ */arm/ - e s/sa110/arm/)這一行。
將ARCH := 改為 ARCH := arm
將CROSS_COMPILE:=改為 CROSS_COMPILE := 交叉編譯工具中arm-linux所在目錄/arm-linux-(如:CROSS_COMPILE := /usr/local/arm/2.95.3/bin/arm-linux-)此后就可以進行編譯。
3 關于交叉編譯環境
交叉編譯環境的建立最重要的就是要有一個交叉編譯器。所謂的交叉編譯就是:利用運行在某機器上的編譯器編譯某個源程序生成在另一臺機器上運行的目標代碼的過程。這里我們主要用到的編譯器是arm-linux-gcc,它是gcc的arm改版。無論編譯器的功能有多么強大,但它的實質都是一樣的,都是把某種以數字和符號為內容的高級編程語言轉換成機器語言指令的集合。具體安裝和配置工作我們一般不需要自己動手了,只要直接從網上下載相關工具包安裝即可。
4 Linux內核裁減
Linux內核移植過程中最重要的一步就是內核裁減。由于目標板硬件平臺的不同以及內核版本的不同,所以涉及的內容往往也有很大不同。下面我們以已改造好的ARM-linux,針對ARM2410平臺來看看內核的裁減主要涉及的地方。
4.1 Linux內核裁減的配置菜單命令
Linux內核裁減的配置菜單命令有好幾個版本,運行:
(1)make config:基于文本的最為傳統的配置界面,進入命令行,可以一行一行的配置,這不好使用,并且很煩瑣。
(2)make menuconfig:基于文本菜單的配置界面,是字符終端下常用的方式。
(3)make xconfig:基于圖形窗口模式的配置界面,Xwindow下推薦使用。
這三個命令中,make xconfig的界面最為友好,如果機器可以使用Xwindow,那么就推薦你使用這個命令,如果不能使用Xwindow,那么就可以使用make menuconfig。界面雖然比上面一個差點,總比make config的要好多了。所有內核配置菜單都是通過Config.in經由不同腳本解釋器產生.config,在內核配置完成后就就會在當前目錄下產生一個.config的配置文件,當然我們也可以直接修改此文件來配置內核。
選擇相應的配置時,有三種選擇,它們分別代表的含義如下:
* -----將該功能編譯進內核
空-----不將該功能編譯進內核
M-----將該功能編譯成可以在需要時動態插入到內核中的模塊
4.2 Linux內核裁減的配置選項
在內核移植的過程中,最煩雜的事情就是配置內核選項了,但實際配置時大部分選項可以使用其缺省值,只有小部分需要根據用戶不同的需要選擇。選擇的原則是將與內核其它部分關系較遠且不經常使用的部分功能代碼編譯成為可加載模塊,有利于減小內核的長度,減小內核消耗的內存,簡化該功能相應的環境改變時對內核的影響;不需要的功能就不要選;與內核關心緊密而且經常使用的部分功能代碼直接編譯到內核中。
針對ARM2410平臺要配置的內核選項主要有:
(1) 配置MTD,要使用Cramfs和YAFFS文件系統,首先需要配置MTD.
在Memory Technology Devices (MTD) --->選項中選中如下選項:
<*> Memory Technology Device (MTD) supportMTD支持
[*]MTD partitioning support MTD分區支持
<*> Direct char device access to MTD devices字符設備的支持
<*> Caching block device access to MTD devices塊設備支持
NAND Flash Device Drivers--->對NAND Flash的支持
<*> SMC Device Support
<*> Simple Block Device for Nand Flash(BON FS)
<*> SMC device on S3C2410 SMDK
[*] Use MTD From SMC
(2)配置文件系統
<*> Kernel automounter version 4 support (also supports v3)文件系統自動掛載支持
<*> DOS FAT fs supportt fs support對DOS/FAT文件系統的支持
<*> VFAT (Windows-95) fs support對FAT32文件系統的支持
<*> Yaffs filesystem on NAND對YAFFS文件系統的支持
<*> Compressed ROM file system support對Cramfs文件系統的支持
[*] Virtual memory file system support (former shm fs)對temfs文件系統的支持
<*> Simple RAM-based file system support對RAM文件系統的支持
[*] /proc file system support對/proc和/dev設備文件系統的支持
[*] /dev file system support (EXPERIMENTAL)/dev設備文件系統支持
[*] Automatically mount at boot 啟動時自動掛載的支持
[*] /dev/pts file system for Unix98 PTYs
Network File Systems---> 對NFS網絡文件系統的支持
<*> NFS file system support
[*]Provide NFS v3 client support
(3)配置系統類型,主要是CPU類型
(S3C2410-based)ARM system type設置ARM的系統類型為ARM2410
[M] S3C2410 USB function support 對USB功能的支持
[*] ARM920T CPU idle設置處理器的類型
[*] ARM920T I-Cache on
5 內核的編譯
在完成內核的裁減之后,內核的編譯就是一個非常簡單的過程。你只要執行以下幾條命令就行:
(1) make clean
這條命令是在正式編譯你的內核之前先把環境給清理干凈。有時你也可以用make realclean或make mrproper來徹底清除相關依賴,保證沒有不正確的.o文件存在。
(2)make dep
這條命令是編譯相關依賴文件。
(3)make zImage
這條命令就是最終的編譯命令。有時你可以直接用make(2.6.X版本上用)或make bzImage(給PC機編譯大內核時用)
完成后,就會編譯出一個壓縮內核映像文件,壓縮內核映像所在路徑為:arch/arm/boot/zImage
(4) make install
這條命令可以把相關文件拷貝到默認的目錄,當然在給嵌入式設備編譯時這步可以不要,因為具體的內核安裝還需要你手工進行。
(5)make modules
這條命令是編譯在配置時選擇為模塊的,即選項前為[M]的。如果你的內核配置選項中有選擇編譯為模塊的,就需要此命令。
(6)make modules_install
這條命令將make modules 生成的模塊文件復制到相應的目錄。在給嵌入式設備編譯時這步也可以不需要。
6 結束語
最后我們就可以將上面第三步產生的壓縮內核映像文件燒寫到嵌入式系統中去,最終完成嵌入式系統內核的移植。
參考文獻:
[1] 孫紀坤,張小全. 嵌入式LINUX系統開發技術祥解—基于ARM. 北京:人民郵電出版社 2006.
[2] 魏洪興,胡亮,曲學樓. 嵌入式系統設計與實例開發實驗教材—基于ARM9微處理器與Linux操作系統. 北京:清華大學出版社,2005.
[3] 于明,范書瑞,曾祥燁. ARM9嵌入式系統設計與開發教程. 北京:電子工業出版社 2006.
收稿日期:2008-03-05
作者簡介:鄒球,男,湖南人,在讀研究生,主要研究方向:網絡,嵌入式系統。