基于S3C2410的嵌入式Linux系統(tǒng)構(gòu)建
目前,在嵌入式系統(tǒng)中基于ARM微核的嵌入式處理器已經(jīng)成為市場(chǎng)主流。隨著ARM技術(shù)的廣泛應(yīng)用,建立面向ARM構(gòu)架的嵌入式操作系統(tǒng)成為當(dāng)前研究的熱點(diǎn)問題。已經(jīng)涌現(xiàn)出許多嵌入式操作系統(tǒng),如VxWork,windows-CE,PalmOS,Linux等。在眾多的嵌入式操作系統(tǒng)中,Linux以其開源代碼及免費(fèi)使用倍受開發(fā)人員的喜愛。本文選用的微處理器S3C2410是基于32位ARM920T內(nèi)核的微處理器,基于此處理器構(gòu)造一Linux嵌入式操作系統(tǒng),將其移植到基于32位的ARM920T內(nèi)核的系統(tǒng)中,在此基礎(chǔ)上進(jìn)行應(yīng)用程序開發(fā)。 1 開發(fā)環(huán)境介紹 1.1 基于S3C2410 ARM920T的硬件平臺(tái) 該系統(tǒng)的硬件平臺(tái)為深圳旋極公司提供,硬件的核心部件為三星$3C2410 ARM920T芯片,外圍還包括:64 M NAND FLASH和RAM外圍存儲(chǔ)芯片;串口、網(wǎng)口和USB外圍接口;CSTN LCD和觸摸屏外圍顯示設(shè)備;UDAl34lTS的外圍音頻設(shè)備。S3C2410處理器和外圍設(shè)備共同構(gòu)成了基于ARM920T的開發(fā)板。 1.2嵌入式Limlx軟件系統(tǒng) 該嵌入式Linux的軟件系統(tǒng)包括以下4個(gè)部分:引導(dǎo)加載程序vivi;Linux2.6.14內(nèi)核;YAFFS2文件系統(tǒng)以及用戶程序。他們的可執(zhí)行映像依次存放在系統(tǒng)存儲(chǔ)設(shè)備上,如圖1所示: 與通常的嵌入式系統(tǒng)布局有所不同,本系統(tǒng)在引導(dǎo)加載程序和內(nèi)核映像之間還增加了一個(gè)啟動(dòng)參數(shù)區(qū),在這個(gè)區(qū)里存放著系統(tǒng)啟動(dòng)參數(shù)。引導(dǎo)加載程序通過調(diào)用這些參數(shù)來決定啟動(dòng)模式、啟動(dòng)等待時(shí)間等,這些啟動(dòng)參數(shù)的增加加強(qiáng)了系統(tǒng)的靈活性。本系統(tǒng)采用64 M NANDFLASH的存儲(chǔ)設(shè)備,其布局如表1所示。 2嵌入式Linux系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn) 2.1 引導(dǎo)加載程序vivi 2.1.1 vivi的基本功能 該系統(tǒng)使用的:Bootloader是vivi,vivi是韓國MIZIResearch公司為其開發(fā)的SMDK2410開發(fā)板編寫的一款引導(dǎo)程序。vivi是CPU加電后運(yùn)行的第一段程序,其基本功能是初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而為調(diào)用嵌入式Linux內(nèi)核做好準(zhǔn)備。 vivi由2部分組成:一部分是依賴于CPU體系結(jié)構(gòu)的代碼,用匯編語言實(shí)現(xiàn)對(duì)硬件環(huán)境的初始化,并為第二部分代碼的執(zhí)行做好準(zhǔn)備;另部分是用C語言實(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一UD- known-Linux一: ARM-GCC-LIBS=/opt/host/armv41/lib/gcc-lib/ar- mv41一unknown-Linux/2.95.2: (2)修改/vivi/arch/s3c2410/smdk.C文件里的mtd-par-tition-t default-mtd-partitions[]分區(qū)內(nèi)容如表1所示; (3)增加/vivi/lib/loadyaffs.C文件,實(shí)現(xiàn)燒寫yaffs2 映像文件;修改/vivi/lib/Config_cmd.in,增加如下一行:bool‘load yaffs tO flash command‘CONFIG-LOAD-YAFFS,使得loadyaffs命令可作為可選項(xiàng); (4)執(zhí)行make distclean:清理vivi編譯環(huán)境;執(zhí)行make menuconfig進(jìn)行對(duì)vivi裁剪,根據(jù)實(shí)際情況進(jìn)行選擇,注意要選上" load yaffs tO flash command"因?yàn)檫@里用的是YAFFS2文件系統(tǒng),需要vivi支持YAFFS2映像下載;執(zhí)行make生成所需要的文件vivi; (5)采用JTAG燒寫映像到目標(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ù)$3C2410的體系結(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<Linux/mtd/pa rtitions.hi> #include<Linux/mtd/nand.h> #inelude<asm/arch/nand.h> ②增加static struct mtd-partition partition-info[]函數(shù),建立分區(qū)表信息,分區(qū)內(nèi)容如表1所示; ③加入Nand Flash分區(qū):struet s3c24 1 O-nand-set nandset一{nr_partitions:5,partitions:partition-info,}; ④建立Nand Flash 芯片支持struct s3c24 10-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í)初始化NAND FLASH信息。 (4)為了使內(nèi)核支持devfs并在啟動(dòng)時(shí)在/sbin/init運(yùn)行之前自動(dòng)掛載/dev為devfs文件系統(tǒng).修改fs/Kconfig.并在menu"Pseudo filesystetns"下添加如下語句: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í)行make menuconfig:對(duì)內(nèi)核進(jìn)行配置是量體裁衣的過程.是十分復(fù)雜的過程,配置適合自已的內(nèi)核可能需要多次重復(fù)的配置操作。以下根據(jù)該系統(tǒng)對(duì)部分配置做簡單介紹: Boot options一一一>Default kernel command st ring Noinitrd root=/dev/mtdblock3 init=/Linuxrc console——ttySAC0.1 15200 說明:mtdblock3代表NAND FASH第4個(gè)分區(qū),他足該系統(tǒng)的root分區(qū); Floating point emulation一一一> NwFPE math emulation #選擇在內(nèi)核中使用NWFPE浮點(diǎn)模擬 File systems一一一> <>Second extended fs support |