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