趙瑞娟 李敬兆
摘 要: 首先對(duì)嵌入式Linux操作系統(tǒng)內(nèi)核和S3C2410處理器進(jìn)行了簡單介紹,在此基礎(chǔ)上,對(duì) 系統(tǒng)引導(dǎo)程序進(jìn)行了設(shè)計(jì),重點(diǎn)介紹了將Linux移植到S3C2410處理器的步驟和方法,并對(duì)移 植過程的關(guān)鍵部分進(jìn)行了詳細(xì)闡述。編譯生成的內(nèi)核在嵌入式系統(tǒng)中運(yùn)行穩(wěn)定,結(jié)果證明方 法可行,對(duì)于開發(fā)其它嵌入式系統(tǒng)具有參考意義。
關(guān)鍵詞:嵌入式操作系統(tǒng);移植;Linux;S3C2410
中圖分類號(hào): TP368.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-1098(2008)03-0073-04
1 Linux內(nèi)核和實(shí)驗(yàn)系統(tǒng)簡介
嵌入式操作系統(tǒng)作為大多數(shù)嵌入式應(yīng)用系統(tǒng)的軟件平臺(tái),它管理著系統(tǒng)的資源,為應(yīng)用 軟件提供各種必要的服務(wù)。在嵌入式應(yīng)用系統(tǒng)中使用嵌入式操作系統(tǒng),已是大勢(shì)所趨。目前 嵌入式操作系統(tǒng)的種類繁多,但Linux以其源代碼開放和可移植性強(qiáng)等特點(diǎn),被廣泛使用。 本文將介紹如何將內(nèi)核版本為2.4.18的Linux移植到基于ARM920T的S3C2410處理器上。
1.1 Linux操作系統(tǒng)內(nèi)核
Linux操作系統(tǒng)主要由內(nèi)核、shell、文件結(jié)構(gòu)組成,其中內(nèi)核是靈魂,負(fù)責(zé)整個(gè)系統(tǒng)的 內(nèi)存管理、進(jìn)程調(diào)度和文件管理。Linux內(nèi)核與大部分UNIX內(nèi)核一樣是單內(nèi)核體系結(jié)構(gòu)的, 能夠根據(jù)需要定制內(nèi)核映像的尺寸,具有很大靈活性,不需要重新編譯內(nèi)核和引導(dǎo)就能檢驗(yàn) 新的內(nèi)核組件,這個(gè)特性對(duì)于嵌入式而言是非常有好處的,方便用戶構(gòu)筑自己的個(gè)人內(nèi)核。 Linux內(nèi)核有五個(gè)主要的子系統(tǒng)組成:進(jìn)程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口和進(jìn) 程間通信。
本文將對(duì)內(nèi)核版本為2.4.18的Linux進(jìn)行移植,其內(nèi)核代碼分布如圖1所示。
(1) /arch目錄包含了目前Linux支持的硬件結(jié)構(gòu)——如i386、alpha、arm等的內(nèi)核代碼;
(2) /drives目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序;
(3) /fs目錄包含了所有的文件系統(tǒng)的代碼;
(4) /include目錄包含了建立內(nèi)核代碼所需要的大部分庫文件,這個(gè)模塊利用其它模塊重建 內(nèi)核;
(5) /init目錄包含了內(nèi)核的初始化代碼,內(nèi)核從此處運(yùn)行;
(6) /ipc目錄包含了進(jìn)程間通信代碼;
(7) /kernel子目錄包含了主內(nèi)核代碼;
(8) /mm目錄包含所有獨(dú)立于CPU體系結(jié)構(gòu)的內(nèi)存管理代碼;
(9) /net目錄包含了和網(wǎng)絡(luò)相關(guān)的代碼,如ipv4、ipv6等。
一般在每個(gè)目錄下都有一個(gè).depend文件和一個(gè)Makefile文件,這兩個(gè)文件都是編譯時(shí)使用 的輔助文件。
1.2 S3C2410處理器
S3C2410是SAMSUNG公司基于ARM920T處理器內(nèi)核開發(fā)的一款16/32位嵌入式處理器,運(yùn)行 頻率高達(dá)200多MHz,具有MMU和高速緩存等豐富片上資源,可以廣泛用于PDA、internet設(shè)備 和手持式設(shè)備。其片上集成的功能主要包括以下幾個(gè)方面:
(1) 1.8V ARM 內(nèi)核,3.3V存儲(chǔ)器,3.3V外部I/O, 具有16kB指令緩存/16kB數(shù)據(jù)緩存和MMU 的微處理器;
(2) 外部存儲(chǔ)控制器(SDRAM 控制和片選邏輯);
(3) LCD控制器(支持上到4k色的STN和256k色的TFT), I通道LCD專 用DMA;
(4) 具有外部請(qǐng)求引腳的4通道DMA;
(5) 3通道UART, 2通道SPI;
(6) 1通道IIC總線控制器,1通道US總線控制器;
(7) 1.0版本的SD主機(jī)接口和兼容的2-11版本的Multi-Media卡協(xié)議;
(8) 2端口 USB 主機(jī),1端口 USB 設(shè)備(USB1.1);
(9) 4通道PWM定時(shí)器,1通道內(nèi)部定時(shí)器;
(10) 看門狗電路;
(11) 117個(gè)通用I/O口,24通道外部中斷源;
(12) 電源控制:常規(guī)、緩慢、空閑和斷電模式;
(13) 8通道10位ADC和觸摸屏接口;
(14) 具有日歷功能的實(shí)時(shí)時(shí)鐘RTC;
(15) 具有鎖相環(huán)的片上時(shí)鐘發(fā)生器。
2 將Linux移植到S3C2410
2.1 移植思路
首先要為Linux設(shè)計(jì)一個(gè)BootLoader,通過BootLoader來初始化硬件,引導(dǎo)Linux運(yùn)行。 Bootloader設(shè)計(jì)可以在ads中實(shí)現(xiàn)。然后,針對(duì)硬件環(huán)境和設(shè)計(jì)的 BootLoader修改Linux內(nèi) 核。接下來,在Linux操作系統(tǒng)下建立交叉編譯環(huán)境。最后,配置、編譯、連接Linu x,下 載編譯得到的映像文件到Flash,通過BootLoader 來啟動(dòng)嵌入式操作系統(tǒng)Linux。
2.2 Boot Loader的設(shè)計(jì)
引導(dǎo)加載程序通常稱為Boot Loader,就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序 。通過這段小程序,初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件 環(huán)境,為調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。
本系統(tǒng)Boot Loader的第一階段主要完成基本的硬件初始化,用匯編語言實(shí)現(xiàn):①關(guān)閉w atchdog,屏蔽所有中斷;②設(shè)置處理器時(shí)鐘和工作頻率,CPU工作頻率為200 M Hz;③初始化外部寄存器;④初始化堆棧指針SP;⑤拷貝Boot Loader的第二階段到RAM空間 中,使用一個(gè) 跳轉(zhuǎn)語句跳轉(zhuǎn)到第二階段的main入口函數(shù)。在完成以上操作后就為main函數(shù)的運(yùn)行建立起了 一個(gè)基本的環(huán)境。
第二階段用C語言完成:①通用I/O口的設(shè)置;②完成內(nèi)存映射初始化和內(nèi)存管理單元初 始化:men璤map璤init(); mmu璤init(); 這兩個(gè)函數(shù)在/arch/s3c2410/mmu.c中;③初 始化mtd設(shè)備:mtd璤dev璤init();這個(gè)函數(shù)在/drivers/mtd/maps/s3c2410璤flash.c中 ;④拷貝flash中的kernel映像和根文件系統(tǒng)映像到RAM空間中;⑤跳轉(zhuǎn)到內(nèi)核的第 一條指令 處。跳轉(zhuǎn)時(shí)需要滿足下列條件:R0為0;R1為機(jī)器類型ID;禁止中斷(IRQ和FIQ);C PU設(shè)置 為SVC模式(SVC是供操作系統(tǒng)使用的一種保護(hù)模式);關(guān)閉MMU;關(guān)閉數(shù)據(jù)Cache。至此Boot Loader的任務(wù)結(jié)束。
2.3 Linux內(nèi)核的修改
假定內(nèi)核代碼放在/usr/src/Linux-2.4.18目錄下
(1) 打開根目錄下的Makefile文件 此文件用來指定編譯規(guī)則,例如哪些需要編譯,哪些 需要先編譯。
指定目標(biāo)平臺(tái):Arch=arm;
指定交叉編譯器:添加CROSS璤COMPILE=arm-linux-。
(2) 打開/arch/arm目錄下的Makefile文件 啟動(dòng)代碼的產(chǎn)生需要通過此文件,由于2.4內(nèi) 核還沒有對(duì)S3C2410的支持,在此添加如下代碼:
ifeq((CONFIG璤ARCH璤S3C2410),y)
TEXTADDR=0xC0008000
MACHINE=s3c2410
Endif
TEXTADDR是內(nèi)核的最終運(yùn)行地址,該位置一般在RAM區(qū)起始地址偏移0x8000處(RAM起始地址 到偏移0x8000之間的32KB空間中存放一些全局?jǐn)?shù)據(jù)結(jié)構(gòu)如啟動(dòng)參數(shù)、內(nèi)存頁表等信息)。