摘 要:Linux被廣泛的應用在嵌入式領域,根據實際需要構建一個自己的嵌入式Linux變得尤為重要。根據實際需要介紹嵌入式Linux系統的構建,框架及其移植技巧,并以三星公司的S3C2410處理器芯片為例,將開源Linux操作系統移植到此ARM處理器上,詳細闡述開發環境的搭建,Bootloader的架構及功能,內核及文件系統的編譯及移植技巧。實驗證明,移植后的系統運行穩定且高效,對構建其他嵌入式操作系統具有參考意義。
關鍵詞:S3C2410;嵌入式系統;Bootloader;內核;文件系統
中圖分類號:TP316文獻標識碼:B
文章編號:1004-373X(2008)24-040-03
Method of Porting on the Embedded Linux System
LI Jing,ZHAO Xiaoqiang,FAN Jiulun
(Xi′an Institute of Posts and Telecommunication,Xi′an,710061,China)
Abstract:Linux is used widely in the embedded field,it is important to build our embedded Linux system,according to the project,this paper introduces the method of building the embedded Linux system.Taking the Linux transplanted onto the target board based on the process or of S3C2410 as an example.Method of embedded Linux is transplanted,then,how to build up an environment is described,focusing on the framework and functionality of Bootloader and transplant of Linux kernel.This method proves high effective,the transplanted Linux in the embedded system runs well and a good reference to the others embedded operator system is given.
Keywords:S3C2410;embedded system;Bootloader;kernel;file system
嵌入式系統是以應用為中心,以計算機技術為基礎,軟硬件可裁剪,適用于對功能、可靠性、成本、體積、功耗等有嚴格要求的專用計算機系統。嵌入式Linux是按照嵌入式操作系統的要求設計的一種小型操作系統,非常適合于移植到嵌入式系統中。嵌入式Linux應用最廣泛的地方就是基于ARM地應用,ARM芯片是一種高性能、低功耗地RISC芯片,被廣泛地應用于各個領域[1,2]。
目前,基于ARM核的處理器成為市場的主流,建立面向ARM架構的操作系統成為人們研究的熱點,而Linux由于它的開源性,被廣泛地應用于嵌入式系統中,任何人都可以根據自己的需要來對其進行裁減,以適應自己的系統。根據實際需要將Linux移植到基于ARM920T核的s3c2410處理器芯片上,在總結現有方法存在的問題的基礎上,詳細介紹了移植的原理與方法技巧,對于構建其他的嵌入式Linux有一定的參考意義。
1 開發環境構建
1.1 嵌入式硬件平臺
系統硬件平臺核心部件為三星S3C2410 ARM920T芯片,其工作頻率最高達200 MHz。外圍包括64 MB的NAND FLASH 和64 MB的RAM,鍵盤接口、串口、CPLD譯碼單元、網絡單元、語音單元、LCD及觸摸屏等。
1.2 嵌入式軟件平臺
軟件平臺一般包括Bootloader、內核、文件系統以及用戶程序4大部分,它們的可執行映像存放在系統的存儲設備上。在FLASH空間上存儲的順序如下:0~128 kB用于存儲啟動代碼(VIVI);128~192 kB用于存儲啟動參數;192 kB~3 MB用于存儲內核映像,3 MB以上用于存儲文件系統,其余為用戶程序。FLASH存儲結構如圖1所示。

1.3 交叉開發環境搭建
基于Linux 操作系統的應用開發環境一般是由目標系統的硬件系統和宿主PC機構成。目標硬件系統用于運行操作系統和系統應用軟件,而目標硬件系統所用到的操作系統的內核編譯、應用程序的開發需要通過宿主PC機來編譯完成。雙方之間可以通過建立以太網接口、USB等來調試編譯好的驅動或應用程序。當編譯、調試通過后,再添加到內核中去。首先要正確安裝Linux操作系統,下面介紹用Crosstool制作交叉工具鏈。
首先下載所需要的資源文件[3]:
Crosstol-0.4.2.tar.gz,binutils-2.15.tar.bz2,gcc-3.3.6.tar.gz,glibc-2.3.2.tar.gz,linux-lib-header-2.6.12.0.tar.bz2,glibc-linxuthreads-2.3.2.tar.gz。準備好這些資源之后需要在crosstool-0.42目錄下創建配置文件arm.sh,指出工具鏈源碼所在位置和安裝的目錄,再修改配置文件arm.dat和gcc-3.3.6-glibc-2.3.2.dat文件,最后執行arm.sh腳本就可以在指定目錄生成所需要的交叉編譯工具。
2 嵌入式Linux的移植
2.1 BootLoader的移植
在嵌入式系統中,BootLoader的作用與PC 機上的BIOS 類似,通過BootlLoader可以完成對系統板上的主要部件如CPU,SDRAM,FLASH,串行口等進行初始化,也可以下載文件到系統板上,對FLASH進行擦除與編程。當運行操作系統時,Bootloader會在操作系統內核運行之前運行,通過它可以分配內存空間的映射,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統準備好正確的環境[4]。
2.2 BootLoader的架構功能
系統使用的BootLoader是VIVI,VIVI是CPU加電后運行的第一段程序,其基本功能是初始化硬件設備,建立內存空間的映射圖,從而為調用嵌入式 Linux內核做好準備。VIVI由2部分組成:一部分是依賴于CPU體系結構的代碼,用匯編語言實現對硬件環境的初始化,并為第二部分代碼的執行做好準備;另一部分是用C語言實現內存空間的映射,并將內存映像和根文件系統映像從FLASH中讀取到RAM中,設置好啟動參數后啟動內核。
VIVI的stage1是BootLoader一開始就執行的操作,其目的是為了stage2的執行以及隨后的內核的執行設置好一些基本的硬件環境。其步驟如下所示:
(1) 硬件初始化:當上電或復位后,VIVI啟動,位于NAND中的前4 kB程序便從NANDFLASH中由S3C2410自動拷貝到SteppingStone的前4kB的內部RAM中該RAM之后被映射到地址0x00處。此時VIVI的前4 kB代碼開始運行,關閉Watchdog,關閉中斷,初始化PLL和時鐘主頻設定,初始化存儲器設定;
(2) 配置串口:初始化串口控制器;
(3) 復制自身到SDRAM中:當初始化串口結束后,VIVI開始把自身從NANDFLASH中復制到SDRAM中;
(4) 跳轉到 stage2的入口點。VIVI的stage2階段,包括以下步驟:
① 繼續初始化系統硬件;
② 內存影射初始化,內存管理單元初始化;
③ 初始化堆棧;
④ 初始化mtd 設備;
⑤ 初始化私有數據;
⑥ 初始化內置命令;
⑦ 啟動VIVI。
2.3 BootLoader的移植
(1) 修改Malkefile,指定交叉編譯:
ARCH = arm
CROSS_COMPILE=/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin/arm-linux-
(2) 修改/arch/s3c2410/smdk..c文件,按照上面所指定大小指定NAND分區;
(3) 編譯生成VIVI。
2.4 Linux內核的移植
本實驗系統運行的Linux版本是針對2.6.14.1進行移植,下載內核代碼在/linux下,移植按照以下步驟:
(1) 設置目標平臺和指定交叉編譯器:
在最上層的根目錄/Makefile文件中,首先要指定所移植的硬件平臺,以及所使用的交叉編譯器。改為如下:
ARCH = arm CROSS_COMPILE =/opt/crosstool/gcc-3.3.6-glibc-2.3.2/arm-linux/bin/arm-linux-
(2) 設置NAND FLASH分區:
在arch/arm/mach-s3c2410/devs.c中添加頭文件:
#include
#include
#include
(3) 將static struct mtd_partition partition_info[]中的分區和VIVI中的分區分成一樣大小。
(4) 加入 NAND FLASH分區:
struct s3c2410_nand_set nandset = {nr_partitions:5,partitions:partition_info,};
(5) 建立芯片支持
struct s3c2410_platform_nand superlpplatform =
{tacls:0,twrph0:30,twrph1:0,sets:nandset,nr_set s:1,};
(6) 在NAND FLASH驅動里加入NAND FLASH 芯片支持:
在s3c_device_ nand中增加dev = {.platform_data =super-lpplatform}。
(7) 在 arch/arm/machs3c2410/ machsmdk2410.c 中的__initdata 部分增加 s3c_device_ nand,使內核啟動時初始化 NAND FLASH信息。
(8)去掉NADD FLASH的ECC,修改drivers/mtd/nand/s3c2410.c,在s3c2410_nand_init_chip函數里修改NAND_ECC_SOFT為NAND_ECC_NON。
(9) 配置編譯項,通過在終端下輸入命令make menuconfig來對Linux進行配置,配置完成后通過輸入命令:make 即可在/arch/arm/boot下生成所需要的內核文件zImage。
2.5 制作文件系統
Cramfs被設計為簡單的較小的可壓縮的文件系統,它主要用于較小ROM的嵌入式系統,它是一個壓縮的文件系統,本系統采用Cramfs文件系統。
可以利用工具軟件Busboy和MKCRAMFS制作CRAMFS文件系統。首先在本地建立根文件系統myroot,然后在其目錄下建立所需要的子目錄,如bin,dev,etc,lib,mnt,proc,sbin,usr等。建立好目錄之后要給各相應的目錄復制相應的文件或庫,可以通過BusyBox來實現。BusyBox是一個可配置的工具。通過make menuconfig 配置完成BusyBox后,修改BusyBox的Makefile內容,使用交叉編譯環境。然后通過make 命令進行編譯,make install進行安裝,再將生成的目錄下的相應文件復制到所構建的文件系統的相應目錄下,然后編寫相應的linuxrc等文件。完成這些步驟后,利用MKCRAMFS工具來制作所需要的文件系統,只需要在終端通過命令mkcramfs myroot myroot.crarmfs就可以把myroot制作成只讀的壓縮的cramfs文件系統。
2.6 內核及文件系統的下載
利用VIVI通過超級終端重新下載VIVI,內核和root,在Windows下啟動超級終端,或者Linux下啟動Minicom設置其為(115200,8位數據,1位停止位,無奇偶校驗),用串口線連接實驗系統和 PC 機的串口。系統上電后,在VIVI命令行下操作:
下載VIVI:輸入vivi> load FLASH vivi x,之后,通過 xmodem 協議發送vivi 文件;
下載內核:輸入vivi> load FLASH kernel x,通過 xmodem 協議發送內核文件;
下載文件系統:輸入vivi> load FLASH root x,通過 xmodem 協議發送root文件系統。
3 結 語
針對嵌入式Linux的構建,以S3C2410處理器為例,詳細闡述整個Linux系統構建的原理框架和移植的方法,對移植中的關鍵技術和重要步驟給出了詳細的說明。移植后的Linux 系統在開發板上運行穩定,性能良好。操作過程對嵌入式Linux系統在其他處理器上的移植也具有參考意義。
參考文獻
[1]劉振綱,劉成安,盧劍翔.移植標準Linux到S3C2410[J].微計算機信息,2006(11):152-153.
[2]陶列駿,潘金貴.Linux的可移植性[J].小型微型計算機系統,2002(1):50-53.
[3]李亞鋒,歐文盛.ARM嵌入式Linux系統開發[M].北京:清華大學出版社,2007.
[4]張杰,吳敏,曹衛華.基于S3C2410的Linux移植[J].微型電腦應用,2005(3):57-59.
[5]章曉明,杜春燕,陸建德.HHPPC8245上的嵌入式Linux移植及VPN開發[J].計算機工程,2007(1):274-276.
[6]陳峰,李濱滔,戈志華.基于S3C2410的嵌入式 Linux系統構建[J].現代電子技術,2007,30(24):55-57.
[7]劉明博,鄧中亮.基于ARM的嵌入式操作系統移植的研究[J].計算機系統應用,2006(11):87-88.
[8]許榮.基于AT91RM9200的嵌入式Linux系統移植[J].電子技術,2006(3):64-68.
[9]Daniel P.Bovel Understanding the Linux Kernel[M].2ndEdition.OReilly,2002.
[10]CPU:Samsung Electronics Co.Ltd.User′ManuaL S3C2410X 32-Bit RISC Micro-processor Revision1.2.2004
作者簡介 李 晶 男,1983年出生,碩士研究生。主要研究方向為嵌入式系統。