目前,在嵌入式系統(tǒng)中基于ARM微核的嵌入式處理器已經(jīng)成為市場(chǎng)主流。隨著ARM技術(shù)的廣泛應(yīng)用,建立面向ARM構(gòu)架的嵌入式操作系統(tǒng)成為當(dāng)前研究的熱點(diǎn)問(wèn)題。
已經(jīng)涌現(xiàn)出許多嵌入式操作系統(tǒng),如VxWork,windows-CE,PalmOS,Linux等。在眾多的嵌入式操作系統(tǒng)中,Linux以其開(kāi)源代碼及免費(fèi)使用倍受開(kāi)發(fā)人員的喜愛(ài)。本文選用的微處理器S3C2410是基于32位ARM920T內(nèi)核的微處理器,基于此處理器構(gòu)造一Linux嵌入式操作系統(tǒng),將其移植到基于32位的ARM920T內(nèi)核的系統(tǒng)中,在此基礎(chǔ)上進(jìn)行應(yīng)用程序開(kāi)發(fā)。
l、開(kāi)發(fā)環(huán)境介紹
1.1、基于S3C2410ARM920T的硬件平臺(tái)
該系統(tǒng)的硬件平臺(tái)為深圳旋極公司提供,硬件的核心部件為三星$3C2410ARM920T芯片,外圍還包括:64MNANDFLASH和RAM外圍存儲(chǔ)芯片;串口、網(wǎng)口和USB外圍接口;CSTNLCD和觸摸屏外圍顯示設(shè)備;UDAl34lTS的外圍音頻設(shè)備。S3C2410處理器和外圍設(shè)備共同構(gòu)成了基于ARM920T的開(kāi)發(fā)板。
1.2、嵌入式Limlx軟件系統(tǒng)
該嵌入式Linux的軟件系統(tǒng)包括以下4個(gè)部分:引導(dǎo)加載程序vivi;Linux2.6.14內(nèi)核;YAFFS2文件系統(tǒng)以及用戶(hù)程序。他們的可執(zhí)行映像依次存放在系統(tǒng)存儲(chǔ)設(shè)備上.
與通常的嵌入式系統(tǒng)布局有所不同,本系統(tǒng)在引導(dǎo)加載程序和內(nèi)核映像之間還增加了一個(gè)啟動(dòng)參數(shù)區(qū),在這個(gè)區(qū)里存放著系統(tǒng)啟動(dòng)參數(shù)。引導(dǎo)加載程序通過(guò)調(diào)用這些參數(shù)來(lái)決定啟動(dòng)模式、啟動(dòng)等待時(shí)間等,這些啟動(dòng)參數(shù)的增加加強(qiáng)了系統(tǒng)的靈活性。本系統(tǒng)采用64MNANDFLASH的存儲(chǔ)設(shè)備。
2、嵌入式Linux系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
2.1、引導(dǎo)加載程序vivi
2.1.1、vivi的基本功能
該系統(tǒng)使用的:Bootloader是vivi,vivi是韓國(guó)MIZIResearch公司為其開(kāi)發(fā)的SMDK2410開(kāi)發(fā)板編寫(xiě)的一款引導(dǎo)程序。vivi是CPU加電后運(yùn)行的第一段程序,其基本功能是初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而為調(diào)用嵌入式Linux內(nèi)核做好準(zhǔn)備。
vivi由2部分組成:一部分是依賴(lài)于CPU體系結(jié)構(gòu)的代碼,用匯編語(yǔ)言實(shí)現(xiàn)對(duì)硬件環(huán)境的初始化,并為第二部分代碼的執(zhí)行做好準(zhǔn)備;另部分是用C語(yǔ)言實(shí)現(xiàn)內(nèi)存空間的映射,并將Linux內(nèi)存映像和根文件系統(tǒng)映像從FLASH上讀到RAM空間中,設(shè)置好啟動(dòng)參數(shù),最后調(diào)用內(nèi)核。
2.1.2、Bootloadcrvivi移植
從網(wǎng)站www.mizi.com下載vivi源碼并解壓,按以下步驟進(jìn)行移植,該系統(tǒng)使用ARM-GCC一2.95.2對(duì)vivi進(jìn)行編譯。
(1)、指定/vivi/Makefile文件中的CROSS-COM-PILE,Linux-INCLUDE-DIR,ARM-GCC-LIBS,如下面的參考路徑:
Linux_INCLUDE_DIR=/opt/host/armv41/include/;
CROSS_COMPILE=/opt/host/armv41/bin/armv41-unknown-Linux-:
ARM-GCC-LIBS=/opt/host/armv41/lib/gcc-lib/armv41一unknown-Linux/2.95.2:
(2)、修改/vivi/arch/s3c2410/smdk.C文件里的mtd-par-tition-tdefault-mtd-partitions[]分區(qū)內(nèi)容如表1所示;
(3)、增加/vivi/lib/loadyaffs.C文件,實(shí)現(xiàn)燒寫(xiě)yaffs2
映像文件;修改/vivi/lib/Config_cmd.in,增加如下一行:bool'loadyaffstOflashcommand'CONFIG-LOAD-YAFFS,使得loadyaffs命令可作為可選項(xiàng);
(4)、執(zhí)行make distclean:清理vivi編譯環(huán)境;執(zhí)行make menu config進(jìn)行對(duì)vivi裁剪,根據(jù)實(shí)際情況進(jìn)行選擇,注意要選上"[*]load yaffs t0 flash command"因?yàn)檫@里用的是YAFFS2文件系統(tǒng),需要vivi支持YAFFS2映像下載;執(zhí)行make生成所需要的文件vivi;
(5)、采用JTAG燒寫(xiě)映像到目標(biāo)板NAND FLASH的零地址處,實(shí)現(xiàn)引導(dǎo)程序的裝載。
2.2、Linux2.6.14內(nèi)核的移植
2.2.1、內(nèi)核的選擇
Linux內(nèi)核版本的更新速度非???,但Linux的內(nèi)核版本發(fā)行同Linux對(duì)嵌入式處理器支持程度的發(fā)展是不同步的,因此,需要對(duì)特定的處理器體系結(jié)構(gòu)選擇合適的內(nèi)核,并且根據(jù)其硬件功能部件加上相應(yīng)的補(bǔ)丁。根據(jù)S3C2410的體系結(jié)構(gòu)以及外圍硬件特性,該系統(tǒng)采用Linux2.6.14內(nèi)核,所用的編譯器為ARM-Linux-GCC一3.4.1版本;由于該系統(tǒng)采用的是YAFFS2文件系統(tǒng),因此需要從網(wǎng)上下載yaffs2.tar.gz文件,解壓并執(zhí)行"./patch.ker.sh/I.inux2.6.14"命令,對(duì)I.inux內(nèi)核打補(bǔ)丁使其支持YAFFS2文件系統(tǒng)。
2.2.2、內(nèi)核的修改
(1)、修改內(nèi)核源碼中Makefile的交義編譯項(xiàng):
ARM_=arm;CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-Linux-;
(2)、在arch/arm/mach-s3c2410/devs.C文件中:
①、增加頭文件定義:
#include
#include
#inelude
②、增加staticstruct mtd-partition partition-info[]函數(shù),建立分區(qū)表信息,分區(qū)內(nèi)容如表1所示;
③、加入NandFlash分區(qū):struet s3c241O-nand-set nandset-{nr_partitions:5,partitions:partition-info,};
④、建立NandFlash芯片支持struct s3c2410-platform-nand superlpplatform={tacls:O,twrph0:30,twrphl:0,sets:&.nandset,nr-sets:1,};
⑤、在Nand Flash驅(qū)動(dòng)里加入Nand Flash芯片支持:在s3C-device-nand中增加.dev一{.platforM一data一&super-lpplatform}。
(3)、在arch/arm/machs3c2410/machsmdk2410.C中的一initdata部分增加&s3c-device-nand,使內(nèi)核啟動(dòng)時(shí)初始化NANDFLASH信息。
(4)、為了使內(nèi)核支持devfs并在啟動(dòng)時(shí)在/sbin/init運(yùn)行之前自動(dòng)掛載/dev為devfs文件系統(tǒng).修改fs/Kconfig.并在menu"Pseudo filesystetns"下添加如下語(yǔ)句:config DEVFS_FSbooI"/dev flie system support(OBOLETE) default yconfig DEVFS-MOUNTbool"Automatically mount at boot"default ydepends on DEVFS FS
2.2.3、內(nèi)核的編譯和加載
(1)、執(zhí)行make mrproper:編譯內(nèi)核前清理編譯環(huán)境。
(2)、執(zhí)行makeme nuconfig:對(duì)內(nèi)核進(jìn)行配置是量體裁衣的過(guò)程.是十分復(fù)雜的過(guò)程,配置適合自已的內(nèi)核可能需要多次重復(fù)的配置操作。以下根據(jù)該系統(tǒng)對(duì)部分配置做簡(jiǎn)單介紹:Boot options一一一>Default kernel command string
No initrd root=/dev/mtd block3 init=/Linuxrc
console--ttySAC0.115200
說(shuō)明:mtdblock3代表NANDFASH第4個(gè)分區(qū),他足該系統(tǒng)的root分區(qū);
Floating point emulation一一一>
[*]NwFPE math emulation
#選擇在內(nèi)核中使用NWFPE浮點(diǎn)模擬
File systems一一一>
<>Second extended fs support
#去除對(duì)ext2的支持
Pseu do filesystems一一>
[*]/proc file system support
[*]Virtual memory file system support(former shmfs)
[*]/dev file system support(OBSOLETE)
[*]Automatically mount at boot(NEW)
這里會(huì)看到前面修改fs/Kconfig的結(jié)果,devfs已經(jīng)被支持。
Miscellaneous file systems一-->
#選擇YAFFS2根文件系統(tǒng)
<*>YAFFS2 file system support
------512byte/pagedevices
[*]Lets Yaffs doi ts own ECC
[]Use the same ecc byte order as Steven Hill'S nand-ecc.C
一一一2048byte(or larger)/page devices
[*]Auto select yaffs2 format
[*]Disable lazy loading
(10)Reserved blocks for check pointing
[*]Turn off wide tnodes
[]Force chunk erase check
[]Cache short names in RAM
Network File Systems---〉
<*〉NFS file system support
(3)、執(zhí)行makeb zlmage,成功編譯后將在arch/arm/boot/下生成需要的文件zImage。
(4)、在vivi提示符下,輸入"load flash kernel x"命令通過(guò)串口下載內(nèi)核映像到NAND FLASH的KERNEL分區(qū)中。
2.3、文件系統(tǒng)
Linux采用文件系統(tǒng)組織系統(tǒng)中的文件和設(shè)備,為設(shè)備和用戶(hù)程序提供統(tǒng)一接口。他支持CRAMFS,JFFS2.RAMDISK等多種文件系統(tǒng)。本系統(tǒng)使用可讀寫(xiě)的YAFFS2根文件系統(tǒng)。
2.3.1、YAFFS2文件系統(tǒng)簡(jiǎn)介
YAFFS2是YAFFS(Yet Ano ther FLASH File System)的升級(jí)版,能更好地支持NAND FLASH,是一種類(lèi)似于JFFS的專(zhuān)門(mén)為FLASH設(shè)計(jì)的嵌入式文件系統(tǒng)。與JFFS相比,他減少了一些功能,因此速度更快、占用內(nèi)存更少。NAND FLASH大多采用MTD+YAFFS的模式,通過(guò)YAFFS文件系統(tǒng),可以像操作硬盤(pán)上的文件一樣操作FLASH中的數(shù)據(jù),在系統(tǒng)斷電后數(shù)據(jù)仍然存儲(chǔ)在FLASH芯片中.
2.3.2、根文件制作
(1)、建立根文件系統(tǒng)目錄root,在root目錄下建訌子日錄bin,sbin,dev,etc,proc,lib,user;
/bin:保存大多數(shù)如init.busybox,shell.文件管理實(shí)用程序等二進(jìn)制文件;
/sbin:保存系統(tǒng)啟動(dòng)過(guò)程通常需要的命令;
/dev:包含用在設(shè)備中的所有沒(méi)備節(jié)點(diǎn);
/etc:包含系統(tǒng)的所有配置文件;
/proc:這是一個(gè)必須設(shè)置的特殊目錄,在系統(tǒng)運(yùn)行之后他下面有許多內(nèi)容,在某些情況下,可以通過(guò)他進(jìn)行系統(tǒng)設(shè)置,許多工具能從這里獲得信息。在編譯內(nèi)核時(shí)要選擇文件系統(tǒng)proc的支持;/lib:包含所有必要的庫(kù);
/user:存放用戶(hù)程序。
(2)、編譯busybox.busyh。x足一個(gè)著名的開(kāi)源軟件.他以極小型的應(yīng)用程序集成了一百多個(gè)最常用的Linux命令,閃此享有"嵌入式Linux的瑞士軍刀"的美臀。首先,從網(wǎng)上下載busybox源碼.該系統(tǒng)使用的是1.1.3版本;其次,執(zhí)行make menu config命令.根據(jù)實(shí)際需求進(jìn)行功能配置,該系統(tǒng)將busybox編詳為靜態(tài)連接;最后:執(zhí)行FIlakca11install進(jìn)行編譯、安裝;編譯器為:ARM-Linux-GCC一3.4.1,安裝路徑與上述root為同一路徑。這樣在root目錄下將有腳本Linuxrc.在/bin,/sbin日錄下將訂busy box提供的指向busy box的符號(hào)連接命令集。
(3)、編寫(xiě)啟動(dòng)腳本:一般系統(tǒng)啟動(dòng)時(shí)都會(huì)按要求執(zhí)行相應(yīng)的初始化操作。寫(xiě)住命令仃的init=/Liunxrc·這個(gè)Linuxrc足指向/etc/init.d/rcS文件的一個(gè)符號(hào)連接。在rcs文件中列出了Linux仞始化要執(zhí)行的文件.例如.初始化進(jìn)程init、掛載根系統(tǒng)、掛載模塊化設(shè)備驅(qū)動(dòng)等。rcs的作用相當(dāng)于windoWS中的autocxec.bat文什,由于對(duì)于不同的應(yīng)用rcS的內(nèi)容變化很大,因此應(yīng)根據(jù)實(shí)際需要編寫(xiě)rcS的內(nèi)容。
(4)、制作YAFFs2映象:利用實(shí)用程序nlkyaffsinlage(mkvaffmage與root目錄在同一路徑下)制作YAFFS2映像root.img命令為:
#./inkyaffsimagerootroot.Inlgroot.img就是所需要的YAFFS2文件系統(tǒng);
(5)文件系統(tǒng)映像下載:在vivi提示符下,執(zhí)仃"loadyaffsrootx"選擇root.inlg將文件通過(guò)串口下載到NANDFLASH的root分區(qū)中.然后復(fù)化或重啟開(kāi)發(fā)板,就可以啟動(dòng)Linux系統(tǒng)。
3、結(jié)語(yǔ)
通過(guò)對(duì)嵌入式系統(tǒng)ARNI平臺(tái)的構(gòu)建,分析bootloadervivj的功能.闡述了Linux內(nèi)核的移植,同時(shí)也解釋r制作YAFFS2文件系統(tǒng)的步驟和方法.意在給嵌入式系統(tǒng)平臺(tái)的搭建有個(gè)整體的把握和認(rèn)識(shí),以降低進(jìn)入ARM嵌入式開(kāi)發(fā)應(yīng)用領(lǐng)域的門(mén)檻,進(jìn)一步推進(jìn)嵌入式軟硬件開(kāi)發(fā)的進(jìn)程。
評(píng)論