李勝琴 許巖
西北師范大學(xué)數(shù)學(xué)與信息科學(xué)學(xué)院, 甘肅 蘭州 730070
基于ARM9的嵌入式linux系統(tǒng)移植
李勝琴 許巖
西北師范大學(xué)數(shù)學(xué)與信息科學(xué)學(xué)院, 甘肅 蘭州 730070
對(duì)要裝載到ARM9系列芯片開發(fā)板上的linux系統(tǒng)進(jìn)行定制和裁減,嵌入式linux系統(tǒng)移植主要分為三個(gè)方面:(1)在開發(fā)板上裝載用于引導(dǎo)和硬件初始化的u—B00T程序。(2)linux系統(tǒng)kernel的移植。(3)linux文件系統(tǒng)制作。實(shí)驗(yàn)結(jié)果表明:實(shí)現(xiàn)了linux系統(tǒng)到定制目標(biāo)平臺(tái)的移植。
ARM9;Linux;嵌入式系統(tǒng);linux系統(tǒng)移植
嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。[1]嵌入式Linux系統(tǒng)資源有限、專用性強(qiáng),在部署到嵌入式平臺(tái)之前必須對(duì)其進(jìn)行裁剪、定制,減小嵌入式Linux系統(tǒng)體積,提高運(yùn)行效率。
由于Linux具有內(nèi)核小、效率高、源代碼開放和強(qiáng)大的網(wǎng)絡(luò)支持等一系列獨(dú)特優(yōu)勢(shì),嵌入式Linux將在未來的嵌入式發(fā)展中占最大的優(yōu)勢(shì),其巨大的市場(chǎng)潛力已經(jīng)吸引了眾多的廠商進(jìn)入這一領(lǐng)域。目前,國(guó)外的著名廠商,例如IBM、DELL等,幾乎都在嵌入式Linux操作系統(tǒng)的研究、開發(fā)和推廣方面投入了巨資。國(guó)內(nèi)有一些公司,例如華恒、共創(chuàng)軟件聯(lián)盟、中軟、紅旗、萬禾等,也開始積極從事嵌入式Linux操作系統(tǒng)的研究、開發(fā)和推廣。隨著微電子技術(shù)的不斷創(chuàng)新和發(fā)展,嵌入式系統(tǒng)(Embedded Systems)作為計(jì)算機(jī)應(yīng)用的一個(gè)重要領(lǐng)域,已深入到社會(huì)的方方面面,越來越被人們所關(guān)注。嵌入式系統(tǒng)出現(xiàn)于60年代晚期,它最初被用于控制機(jī)電電話交換機(jī),如今已經(jīng)廣泛地應(yīng)用于工業(yè)制造、過程控制、通訊、航空航海、軍事裝備等相關(guān)行業(yè),而且深入到信息家電、娛樂、社會(huì)文化等各個(gè)領(lǐng)域,掀起了一場(chǎng)數(shù)字化的技術(shù)革命。隨著多媒體技術(shù)與Internet應(yīng)用的迅速普及,消費(fèi)電子(Consumptive electron)、計(jì)算機(jī)(Computer)、通訊(Comunication)等3C一體化趨勢(shì)日趨明顯,極大地推進(jìn)了嵌入式技術(shù)的發(fā)展,使嵌入式技術(shù)再度成為研究與應(yīng)用的熱點(diǎn)。
基于Linux 操作系統(tǒng)的應(yīng)用開發(fā)環(huán)境一般是由目標(biāo)系統(tǒng)硬件(開發(fā)板) 和宿主PC機(jī)所構(gòu)成。目標(biāo)硬件開發(fā)板用于運(yùn)行操作系統(tǒng)和系統(tǒng)應(yīng)用軟件,而目標(biāo)板所用到的操作系統(tǒng)的內(nèi)核編譯、應(yīng)用程序的開發(fā)和調(diào)試則需要通過宿主PC 機(jī)來完成(所以稱為交叉編譯) 。雙方之間一般通過串口、并口或以太網(wǎng)接口建立連接關(guān)系。交叉編譯工具是嵌入式開發(fā)的基礎(chǔ),完善的工具鏈可以保證項(xiàng)目開發(fā)的進(jìn)度和質(zhì)量。交叉編譯工具可以通過兩種方式獲得,一種是直接從網(wǎng)上下載已經(jīng)制作好的交叉編譯工具,另一種就是自己制作交叉編譯工具,制作方式是:(1)下載源碼,準(zhǔn)備補(bǔ)??;(2)設(shè)置環(huán)境變量,指定交叉編譯器的安裝目錄;(3)內(nèi)核頭文件的設(shè)置;(4)二進(jìn)制工具包binutils的設(shè)置;(5)編譯器gcc的設(shè)置;(6)C鏈接庫glibc的設(shè)置;最后是完整編譯器的設(shè)置。本文用的交叉編譯工具為arm-linux-gcc4.0.2,將交叉編譯器解壓到相應(yīng)的目錄下,命令為# tar-zxcf armlinuxgcc4.0.2.tar.bz2,要注意解壓后的路徑。
本文所使用的嵌入式系統(tǒng)目標(biāo)平臺(tái)是SamSung公司基于ARM920T 內(nèi)核的嵌入式處理S3C2410,ARM2410開發(fā)板支持WINCE、Linux、UCOS以及NUCLEUS嵌入操作系統(tǒng)。面向手持式設(shè)備以及高性價(jià)比,低功耗的應(yīng)用,內(nèi)部集成LCD,USB等控制器。Linux內(nèi)核采用2.6版本的內(nèi)核,它吸收了一些新技術(shù),在性能,可靠性和可擴(kuò)展性方面有較大提高。本設(shè)計(jì)基于fedora -12進(jìn)行開發(fā)。
嵌入式Linux系統(tǒng)從軟件方面來說主要包括以下幾個(gè)部分,Bootloader(引導(dǎo)程序),內(nèi)核啟動(dòng)參數(shù),內(nèi)核(kernel)和根文件系統(tǒng)四個(gè)部分,在Flash中存儲(chǔ)的示意圖如圖1所示。[2]
圖1 系統(tǒng)組成
Bootloader指系統(tǒng)啟動(dòng)后,在操作系統(tǒng)內(nèi)核之前運(yùn)行的一小段程序。Bootloader主要完成硬件檢測(cè)和系統(tǒng)引導(dǎo),操作系統(tǒng)的主要功能之一是管理系統(tǒng)硬件設(shè)備,屏蔽硬件細(xì)節(jié),向其上的應(yīng)用提供標(biāo)準(zhǔn)接口,易于應(yīng)用程序的編寫和移植。我們可以初始化硬件設(shè)備,建立內(nèi)存空間的映射圖,從而為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。Bootloader是依賴于硬件而實(shí)現(xiàn)的,但是不管事什么樣的開發(fā)板,都是遵循以下流程:先關(guān)閉中斷,設(shè)置cpu的速度和時(shí)鐘頻率,初始化RAM,將代碼從FLASH中復(fù)制到RAM中,設(shè)置堆棧,這樣就搭建了一個(gè)C運(yùn)行環(huán)境,之后跳轉(zhuǎn)到C入口點(diǎn),就是初始化驅(qū)動(dòng)設(shè)備,設(shè)置linux內(nèi)核參數(shù),啟動(dòng)linux。[3]下載u-boot壓縮包,經(jīng)過解壓修改和設(shè)置一些參數(shù)后,通過JTAG接口燒寫到開發(fā)板的Flash 中。
linux內(nèi)核源碼樹[4]
/include子目錄包含了建立內(nèi)核代碼時(shí)所需的大部分包含文件,這個(gè)模塊利用其他模塊重建內(nèi)核。
/init子目錄包含了內(nèi)核的初始化代碼,這是內(nèi)核工作開始的起點(diǎn)。
/arch子目錄包含了所有硬件結(jié)構(gòu)特定的內(nèi)核代碼,如i386和alpha。
/drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序,如塊設(shè)備和SCSI設(shè)備。
/fs子目錄包含了所有的文件系統(tǒng)的代碼,如ext2和vfat等。
/net子目錄包含了內(nèi)核的聯(lián)網(wǎng)代碼。
/mm子目錄包含了所有內(nèi)存管理代碼。
/ipc子目錄包含了進(jìn)程間通信代碼。
/kernel子目錄包含了主內(nèi)核代碼
2.2.1 內(nèi)核源碼下載
標(biāo)準(zhǔn)的linux內(nèi)核源碼可以從http://www.kernel.org/pub/linux/kernel/v2.6/下載,也可以從鏡像ftp站點(diǎn)獲得,筆者用的是linux-2.6.26.tar.gz,將其解壓到相應(yīng)的目錄下,命令為#tar–zxvf linux-2.6.26.tar.gz。armlinux是針對(duì)標(biāo)準(zhǔn)linux內(nèi)核為arm做的補(bǔ)丁,也可以直接下載針對(duì)linux內(nèi)核打好arm補(bǔ)丁的源碼。
2.2.2 內(nèi)核配置
內(nèi)核配置通常是對(duì)內(nèi)核的各個(gè)功能進(jìn)行取舍配置,將配置的方案保存到configure文件中。在交叉編譯內(nèi)核之前,對(duì)編譯選項(xiàng)的配置是很重要的,本文中選擇對(duì)S3C2410開發(fā)板的支持,選擇File System支持,對(duì)于File System應(yīng)確保如下支持:
(1)proc file system support
(2)ROM file system support
(3)Second extended fs support
然后配置塊設(shè)備,使其支持RAM disk。在編譯內(nèi)核的時(shí)候,就會(huì)根據(jù)此配置進(jìn)行取舍編譯。在編譯目錄下通過make menuconfig命令進(jìn)入內(nèi)核配置界面。
修改內(nèi)核目錄樹根下的Makefile時(shí),指定目標(biāo)平臺(tái)為arm,指定交叉編譯器, 可向Makefile中添加如下內(nèi)容:
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm_cross/4.0.2/bin/arm-linux-
2.2.3 內(nèi)核編譯
編譯內(nèi)核使其生成內(nèi)核映像,編譯內(nèi)核有非壓縮和壓縮兩種方式。[5]壓縮方式,內(nèi)核從ROM中啟動(dòng),將被壓縮的內(nèi)核壓縮到RAM,然后再執(zhí)行內(nèi)核,有點(diǎn)是可以將內(nèi)核事先燒寫至flash中,而無需手工下載,這種方式使用make zimage來編譯內(nèi)核。
#make dep //設(shè)置依賴關(guān)系
#make zIamge //編譯內(nèi)核
交叉編譯內(nèi)核時(shí)間相對(duì)較長(zhǎng),編譯完成后會(huì)形成一個(gè)文件zImage,這就是編譯成功后的ARMLinux內(nèi)核。
根文件系統(tǒng)一直是linux系統(tǒng)不可或缺的組件,在嵌入式linux中,內(nèi)核在啟動(dòng)期間進(jìn)行的最后操作之一就是安裝根文件系統(tǒng)。Busybox是構(gòu)建嵌入式根文件的軟件,用它制作根文件系統(tǒng)簡(jiǎn)單,設(shè)置靈活。根文件系統(tǒng)一般都包括:1)基本的文件系統(tǒng)結(jié)構(gòu),包含一些必需的目錄,比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp;2)基本運(yùn)行程序所需要的庫函數(shù),如:lib/uc-libc;3)基本的系統(tǒng)配置文件,如:rc,inittab等腳本文件;4)必要的設(shè)備文件,如:/dev/tty,/dev/fd0;5)基本的應(yīng)用程序,如:sh,ls,cp,mv等;根文件系統(tǒng)制作就是生成包含上述各種文件系統(tǒng)的過程。[6]
2.3.1 安裝busybox
從網(wǎng)站http://www.busybox.net/下載busybox-1.17.4.tar.bz2,使用tarzxvf busybox-1.17.4.tar.bz2解壓,進(jìn)入busybox-1.17.4.o目錄后執(zhí)行 make munuconfig命令可進(jìn)入配置界面。修改busybox根目錄下的makefile使用交叉編譯器。將ARCH?=$(SUBARCH)修改為ARCH?=arm,將CROSS_COMILE?修改為CROSS_COMILE?=arm_linux-,修改后執(zhí)行make命令編譯busybox。然后安裝busybox。
2.3.2 創(chuàng)建根文件
開發(fā)板的根文件系統(tǒng)在主機(jī)上的目錄為/home/work/lsq,在此目錄下使用mkdir命令創(chuàng)建dev,etc,home,lib,mnt,proc,root,sys,tmp目錄。在/etc目錄下存放配置文件;創(chuàng)建etc/inittab文件,init進(jìn)程根據(jù)/etc/inittab文件來創(chuàng)建其他子進(jìn)程;創(chuàng)建etc/fstab文件,fstab文件描述系統(tǒng)中各種文件系統(tǒng)的信息,應(yīng)用程序讀取這個(gè)文件,然后根據(jù)其內(nèi)容進(jìn)行自動(dòng)掛載的工作。
2.3.3 制作yaffs2文件系統(tǒng)映像文件
制作文件系統(tǒng)映像文件,就是將一個(gè)目錄下的所有內(nèi)容按照一定的格式存放到一個(gè)文件中,這個(gè)文件可以直接燒寫到存儲(chǔ)設(shè)備中。
在yaffs源碼中有個(gè)utils目錄,里面有mkyaffsimage和mkyaffs2image的源代碼,前者制作yaffs映像文件,后者制作yaffs2映像文件,將下載的yaffs2解壓,在目錄/Dovelopment下有兩個(gè)文件夾;進(jìn)入yaffs2/utils目錄,加入兩個(gè)文件:nand-ecc.c和yaffs_packed-tagsl.c;修改makefile文件
MKYAFFSSOURCES=mkyaffsimage.c yaffs_packedtagsl.c nand-ecc.c然后執(zhí)行make生成mkyaffs2image工具,復(fù)制工具到/usr/local/bin目錄下,執(zhí)行#mkyaffsimage2 lsq/pyaffs2.img命令可生成文件系統(tǒng)映像文件,執(zhí)行#gzip –pyaffs2img最終生成嵌入式linux根文件系統(tǒng)的映像文件為pyaffs2-.img.gz。根文件系統(tǒng)制作完成。
下載linux內(nèi)核映像和根文件系統(tǒng)映像文件到目標(biāo)板
#tftp 30008000 zImage /*下載linux內(nèi)核映像到目標(biāo)板內(nèi)存*/
#fftp 300800000 pyaffs2.img.gz /*下載根文件系統(tǒng)映像到目標(biāo)板內(nèi)存*/
#go 30008000 /*啟動(dòng)目標(biāo)板linux*/。
重啟開發(fā)板,能看到嵌入式linux系統(tǒng)在超級(jí)終端完整的打印信息,說明嵌入式linux系統(tǒng)成功的移植到S3C2410上去了。
文章研究了基于arm-linux和S3C2410的嵌入式系統(tǒng)設(shè)計(jì),詳細(xì)地介紹了移植的基本方法,重點(diǎn)說明了移植過程的關(guān)鍵步驟。這對(duì)于嵌入式linux系統(tǒng)的應(yīng)用以后的發(fā)展具有重要意義。
[1] 曹 玥.Linux 內(nèi)核分析及在S3C2440上移植過程[J].科技廣場(chǎng).2010,(1):173-175
[2] 鄧俊華,杜玉曉. 基于S3C2410 處理器的Linux 移植[J]. 技術(shù)交流.2009 25(8) : 53 - 55
[3] 王志誠. 基于ARM9 的嵌入式Linux操作系統(tǒng)的移植[J]. 陶瓷.2010 (3):50-52
[4] 黃義文. Linux操作系統(tǒng)內(nèi)核裁剪的分析[J]. 中國(guó)民航飛行學(xué)院學(xué)報(bào).2010 (3) :56 - 59
[5] 趙 炯. Linux內(nèi)核完全剖析[M]. 北京:機(jī)械工業(yè)出版社. 2006
[6]孫紀(jì)坤,張小全.嵌入式Linux 系統(tǒng)開發(fā)技術(shù)詳解[M].北京:人民郵電出版社.2006
The technique of porting Linux to one board based on Cirrus Logic S3C2410 processor is introduced in this paper, embedded linux system migration can be divided into three areas: (1)loading u-B00T Program used for guidance and hardware initialization in the development board. (2)transplanting kernel in linux system. (3) making linux root filesystem . The results show that it implements the transplantation of linux system to custom target platform.
ARM 9; Linux; Embedded System; porting Linux system
TP316
A
10.3969/j.issn.1001-8972.2011.07.061
李勝琴(1984-),女,漢,河南信陽人,本科,西北師范大學(xué)碩士研究生,研究方向嵌入式系統(tǒng)。