葉培順
(榆林學(xué)院 信息工程學(xué)院,陜西 榆林 719000)
嵌入式系統(tǒng)是以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),軟硬件可裁剪,適用于應(yīng)用系統(tǒng),對功能、可靠性、成本、體積、功耗等方面有特殊要求的專用計算機系統(tǒng)[1]。在嵌入式系統(tǒng)里基于ARM的嵌入式處理已經(jīng)成為市場主流。而Linux是免費運行的,快速高效的操作系統(tǒng),在過去的幾年中,基于開源組織的Linux系統(tǒng)的嵌入式操作系統(tǒng)得到了長足的發(fā)展。Linux操作系統(tǒng)雖然不是微內(nèi)核結(jié)構(gòu),但是其模塊化的結(jié)構(gòu)使得用戶可以對其方便的進行配置,去除用戶系統(tǒng)不需要的模塊,減小系統(tǒng)的開銷可以做到幾百K大小。
本文所討論嵌入式系統(tǒng)目標平臺采用的是Samsung公司基于ARM 920T內(nèi)核開發(fā)的一款嵌入式處理器S3C2440,用于PDA、Internet設(shè)備和手持設(shè)備,內(nèi)部集成了LCD、USB等控制器。Linux內(nèi)核采用2.6版本的內(nèi)核,它吸收了一些新技術(shù),在性能,可量測性支持和可用性方面有較大提高。
嵌入式Linux系統(tǒng)從軟件的角度看通??梢苑譃?個層次:
1)引導(dǎo)加載程序 包括固化在固件中的啟動代碼(可選)和Bootloader 2部分。
2)內(nèi)核 特定于嵌入式板子的定制內(nèi)核以及控制內(nèi)核引導(dǎo)系統(tǒng)的參數(shù)。
3)文件系統(tǒng) 包括根文件系統(tǒng)和建立于Flash內(nèi)存設(shè)備之上的文件系統(tǒng)。通常用RAMDISK作為根文件系統(tǒng)。它是提供管理系統(tǒng)的各種配置文件以及系統(tǒng)執(zhí)行用戶應(yīng)用程序的良好運行環(huán)境的載體[2]。
4)用戶應(yīng)用程序 特定于用戶的應(yīng)用程序。有時在用戶應(yīng)用程序和內(nèi)核層之間可能會包括一個嵌入式圖形用戶界面[3]。
嵌入式Linux的移植可以按照上面4個層次進行。本文將根據(jù)這4個方面分析嵌入式Linux系統(tǒng)在s3c2440上的移植過程。
Linux使用GNU的工具,社區(qū)的開發(fā)者已經(jīng)編譯出了常用體系結(jié)構(gòu)的工具鏈。免費提供的工具包括3個部分:binutils,gcc和glibc,其中binutils是二進制處理工具,gcc是編譯工具,glibc是鏈接和運行庫。交叉編譯工具的安裝步驟如下:
1)從 ARM Linux 的官方站點 http://arm.Linux.org.uk 下載 cross23.3.2.tar.bz2 包;
2)在/usr/local/arm 下解壓:$tar2jxvfcross23.3.2.tar.bz2;
3)在/etc/profile文件中修改PATH環(huán)境變量。在export之前添加一行:
PATH=$PATH: /usr/local/arm/3.3.2/bin 4)使以上配置生效:$source/etc/profile
1)主機環(huán)境配置:首先要確認主機的網(wǎng)絡(luò)接口驅(qū)動成功,并且配置網(wǎng)絡(luò)接口的IP地址??梢酝ㄟ^ifconfig命令查看所有網(wǎng)絡(luò)接口,還可以配置網(wǎng)口的IP地址。
2)串口控制臺工具:串口通信接口很適合作為控制臺,在各種操作系統(tǒng)上一般都有現(xiàn)成的控制臺操作程序可以使用。Windows操作系統(tǒng)有超級終端 (Hyper terminal)工具;Linux操作系統(tǒng)有minicom工具。
3)TFTP服務(wù):TFTP是目標板下載映像所需要的網(wǎng)絡(luò)服務(wù)。以root身份登錄,完成下面的操作:
·編輯tftp配置文件:
$vi/etc/xinetd.d/tftp
修改disab l一行,把yes改為no;
·使用下面的命令使x inetd重新啟動TFTP服務(wù):
$/etc/init.d/xinetd restart
4)N FS服務(wù):N FS服務(wù)的主要任務(wù)是把本地的一個目錄通過網(wǎng)絡(luò)輸出,其他計算機可以遠程的掛接這個目錄并且訪問文件。以root的身份完成以下步驟:
·在/etc/export s中添加一行:
/opt/target/root fs3(rw,no_root_squash,no_all_squash)
·確認N FS守護進程已在運行。使用下面命令啟動或重啟N FS服務(wù):
$/etc/rc.d/init.d/nfs restart
U-Boot作為通用的Bootloader,U-Boot可以方便地移植到其他的硬件平臺上。移植U-Boot工作就是添加開發(fā)板硬件相關(guān)的文件、配置選項,然后配置編譯。開始移植之前,需要先分析一下U-Boot已經(jīng)支持的開發(fā)板,比較出硬件配置最接近的開發(fā)板[4]。選擇的原則是,首先處理器相同,其次處理器體系結(jié)構(gòu)相同,然后是以太網(wǎng)接口等外圍設(shè)備。因為U-Boot代碼中的SMDK2410模板所采用的CUP是s3c2410與s3c2440相似,所以對于U-Boot移植,就是修改SMDK2410模板代碼。
這里使用的是u-boot-1.1.6,其移植的基本步驟如下:
1)在頂層Makefile中為開發(fā)板添加新的配置選項。
RSC2440_config: unconfig
@./mkconfig$(@:_config=) arm arm920t RSC2440 NULL s3c24x0
2)修改 flash驅(qū)動
修改 board/smdk2410/flash.c, 該文件為 RSCARM2440的Flash驅(qū)動程序。需要根據(jù)Flash芯片手冊實現(xiàn)它的驅(qū)動程序。
3)修改與RSCARM2440相關(guān)的頭文件
修 改 include/configs/smdk2410.h, 該 文 件 是 與 RSC ARM2440相關(guān)的頭文件。啟動方式有從nandflash啟動和從norflash啟動兩種,可根據(jù)自己的需要修改。
4)修改目標板的初始化文件
修改board/smdk2410/smdk2410.c,該文件為目標板的初始化文件,其中主要修改的函數(shù)有:
intboard_init( ); //板極初始化函數(shù)
int dram_init(); //SDRAM初始化函數(shù)
5)修改串口驅(qū)動
修改 cpu/arm920t/serial.c,該文件為 RSC ARM2440 的串口驅(qū)動程序,使用RSCARM2440的UART0。
6)修改網(wǎng)絡(luò)驅(qū)動
RSC ARM2440 使用的是 DM9000 網(wǎng)卡,u-boot-1.1.6 中支持DM9000,其代碼在drivers/dm9000x.c中,因此可以直接使用。另外,還需要把DM9000驅(qū)動在include/configs/rsc2440.h加以說明。
標準Linux內(nèi)核相對于資源受到限制的嵌入式系統(tǒng)來說過于龐大,因此要將其移植到嵌入式系統(tǒng)上,就需要將Linux內(nèi)核根據(jù)目標平臺的情況進行剪裁、配置,并對配置好的內(nèi)核進行編譯生成內(nèi)核映像文件。Linux2.6內(nèi)核吸收了一些新技術(shù),在性能、可量測性支持和可用性方面有有較大的提高[5]。
1)修改 Makefile
將makefile中直接將ARCH=$(SUBARCH)這行注釋掉,并加入一行ARCH=arm,目的就是要使編譯出來的目標文件面向的是arm平臺。
還要注釋掉CROSSCOMPILE=這行,加一行CROSS COMPILE=arm-linux-。修改這一行是為了在編譯過程中使用交叉編譯器。
2)配置內(nèi)核
使用makemenuconfig來配置內(nèi)核,盡量裁減內(nèi)核,可以舍棄的部分都先去掉。
3)編譯內(nèi)核
#make dep
#make clean
#make zImage(注意大小寫)
內(nèi)核編譯成功以后,會在Linux2.6/arch/arm/boot目錄中生成一個新內(nèi)核的映像文件zImage。
Ramdisk不是一個文件系統(tǒng)。在Linux中,可以把系統(tǒng)內(nèi)存中的一部分仿真成一個硬盤塊,在它上面可以實現(xiàn)各種基于內(nèi)存的文件系統(tǒng),如Ext2 onRamdisk。內(nèi)存的存儲速度要遠遠快于硬盤,所以可以用這個方法提高文件訪問速度。
3.3.1 制作Linux根文件系統(tǒng)
Linux在內(nèi)核啟動以后,要裝載根文件。在嵌入式Linux中,受存儲器的限制,不能使用桌面Linux那樣復(fù)雜的root文件系統(tǒng),需要對于文件系統(tǒng)進行重新設(shè)計和裁減[6]。通常的處理方法如下:
1)刪除處理 對一些在嵌入式系統(tǒng)中無關(guān)的目錄和文件進行直接刪除處理。
2)strip處理 在Linux中,庫文件和二進制可執(zhí)行文件在發(fā)行時,都包括大量的調(diào)試信息,在嵌入式應(yīng)用中,可以去掉這些代碼以減小程序的大小,采用這種方法有時可以使程序縮小30-50%,從而有效節(jié)約空間。如在嵌入文件系統(tǒng)制作中,可以采用下面命令:
objcopy——strip-all FROM TO
objcopy命令在復(fù)制文件時,帶strip-all.參數(shù),將文件中的調(diào)試信息去掉。
3)文件替換處理 標準 Linux中有些文件功能強丸但體積過大,在嵌入式應(yīng)用中,可以采用一些功能簡單和小巧的文件去替換原來的文件。如在標準的Linux發(fā)行套件中有數(shù)以千計的二進制命令文件,顯然這對嵌入式系統(tǒng)是不合適的,卻而代之,通常使用busybox來提供這些命令。
3.3.2 制作Ramdisk
Ramdisk就是把指定的內(nèi)存區(qū)域模擬成磁盤設(shè)備,它屬于塊設(shè)備驅(qū)動程序,基于Ramdisk的塊設(shè)備,可以建立EXT2格式的磁盤文件系統(tǒng)。在內(nèi)核啟動之前,通常需要把EXT2文件系統(tǒng)的壓縮鏡像解壓到內(nèi)存指定的位置,然后就可以把Ramdisk設(shè)備掛載成根文件系統(tǒng)。制作Ramdisk映像的步驟如下:
這樣就生成了一個壓縮的根文件系統(tǒng)initrd.bin。
1)燒寫 U-Boot
燒寫U-Boot是在windows中通過JTAG進行的,燒寫工具是 SJF2440.exe。把 u-boot.bin 和 SJF2440.exe 拷貝到同一文件夾中。在保證開發(fā)板從nandflash方式啟動的情況下,運行“SJF2440/f:u-boot.bin”,此命令調(diào)入 u-boot.bin 文件燒寫 falsh。
2) 通過 u-boot把 zIamge和 initrd.bin燒寫到 flash對應(yīng)的分區(qū)中。
燒寫zIamge:
#erase 100000 1fffff
#tftp 30000000 zImage
#cp.b 30000000 100000 b9072
燒寫 initrd.bin:
#erase 200000 6fffff
#tftp 30000000 initrd.bin
#cp.b 30000000 200000 312bf0
3)設(shè)置u-boot環(huán)境變量讓系統(tǒng)自動啟動
#setenv bootargs root=/dev/arm rw initrd=0x30800000,8M
#setenv bootcmd bootm 100000 200000
#setenv bootdelay 3
#saveenv
系統(tǒng)復(fù)位后,Linux系統(tǒng)就可以完全自動地從本地flash啟動了。
本文針對一個特定的目標平臺,提供了構(gòu)建一個基本嵌入式Linux系統(tǒng)的過程與方法。對Linux內(nèi)核版本進行裁減、
移植,編譯生成的內(nèi)核在S3C2440處理器的目標板上成功運行,且保留了Linux原有的工作穩(wěn)定的特點,制作的根文件系統(tǒng)可以通過Ramdisk方式正常加載進內(nèi)核。將Linux操作系統(tǒng)移植于嵌入式系統(tǒng)中作為嵌入式系統(tǒng)的底層研發(fā)平臺是一件非常引人注目的事,同時又是一個復(fù)雜的課題,移植后系統(tǒng)的實時性、穩(wěn)定性、安全性和精簡程度等方面都需要嵌入式技術(shù)開發(fā)人員在設(shè)計中進一步研究。
[1]孫紀坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術(shù)祥解[M].北京:人民郵電出版社,2006.
[2]孫天澤,袁文菊.嵌入式設(shè)計及Linux驅(qū)動程序開發(fā)指南[M].北京:電子工業(yè)出版社,2007.
[3]陳賾.ARM9嵌入式技術(shù)及l(fā)inux高級實踐教程[M].北京:北京航空航天大學(xué)出版社,2005.
[4]王學(xué)龍.嵌入式系統(tǒng)設(shè)計與應(yīng)用[M].北京:清華大學(xué)出版社,2002.
[5]北京革新科技有限公司.ARM9實驗指導(dǎo)書[M].北京:北京革新科技有限公司,2007.
[6]趙炯.Linux內(nèi)核完全注釋[M].北京:機械工業(yè)出版社,2004.