陸 靜,李鳳勤
(上海電力學院計算機與信息工程學院,上海 200090)
所謂嵌入式操作系統(tǒng)內核移植,就是使一個操作系統(tǒng)能夠在某個微處理器平臺或微控制器上運行.嵌入式操作系統(tǒng)是嵌入式系統(tǒng)的靈魂,在同一個硬件平臺上可以嵌入不同的嵌入式操作系統(tǒng).例如 ARM7TDMI內核,可以嵌入 Nucleus,VxWorks,μCLinux等不同的操作系統(tǒng).嵌入式操作系統(tǒng)一般都不是為特定的處理器設計的,不能通過簡單的下載方式直接將廠商提供的內核二進制文件下載到嵌入式系統(tǒng)的ROM中運行.因此,嵌入式操作系統(tǒng)的移植技術成為嵌入式開發(fā)中的一個重要問題.本文詳細論述了μCLinux嵌入式操作系統(tǒng)移植到S3C44B0X微處理器的過程及方法,為其他類型的系統(tǒng)內核移植提供借鑒.
μCLinux是Linux操作系統(tǒng)的衍生,由Linux的內核發(fā)展而來,是專門為沒有內存管理單元MMU微處理器(如ARM7TDMI)而設計的嵌入式操作系統(tǒng).μCLinux是對標準Linux進行適當裁剪和優(yōu)化后,形成的高度優(yōu)化、代碼緊湊的嵌入式Linux.它保留了Linux的大多數(shù)優(yōu)點,如穩(wěn)定性、優(yōu)異的網(wǎng)絡能力,以及優(yōu)秀的文件系統(tǒng)支持等[1].
嵌入式μCLinux操作系統(tǒng)主要由3個基本部分組成:引導程序,μCLinux內核,文件系統(tǒng).
內核是操作系統(tǒng)的核心部分,它提供了對計算機設備的核心管理調用.內核所在的地址空間稱作內核空間,外部管理程序與用戶進程所占用的地址空間稱為外部空間.通常一個程序運行會跨越兩個空間,當執(zhí)行到內核空間代碼時,稱程序處于內核態(tài);而當程序執(zhí)行到外部空間代碼時,稱程序處于用戶態(tài).單一內核是操作系統(tǒng)的主流,操作系統(tǒng)中所有的系統(tǒng)相關功能都被封裝在內核中,它們與外部程序處于不同的內存地址空間中,并可以通過各種方式防止外部程序直接訪問內核中的數(shù)據(jù)結構,使程序只允許系統(tǒng)調用的接口訪問系統(tǒng)的內核.而在微內核中,操作系統(tǒng)的內核只需要提供最基本、最核心的一部分操作,如創(chuàng)建刪除任務、內存管理、中斷管理等.其他程序(如文件系統(tǒng)、網(wǎng)絡協(xié)議等)盡可能地放在內核之外,可以獨立地運行,并對外部用戶程序提供操作系統(tǒng)服務,服務之間使用進程間通信機制.Linux采用的是單一內核結構,而μCLinux采用的是微內核結構,并可以通過定制使內核小型化[2,3].
標準Linux是針對有內存管理單元MMU的處理器而設計的.在這種處理器上,虛擬地址被送到MMU,由MMU將虛擬地址映像為物理地址,通過賦予每個任務不同的虛擬—物理地址轉換映射,以支持不同任務之間的保護.μCLinux專門用于支持沒有MMU的處理器,因此不能使用處理器的虛擬內存管理技術.μCLinux對于內存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址,用戶程序與內核處于同一個地址空間,操作系統(tǒng)對內存空間沒有保護.因而在移植操作系統(tǒng)之前,需要充分考慮系統(tǒng)引導裝載程序的大小、中斷向量的大小,以及內核的大小,然后再為它們在FLASH中分配地址.
嵌入式系統(tǒng)的核心是嵌入式處理器.本文所用目標板是以SAMSUNG公司生產(chǎn)的ARM處理器芯片S3C44B0X為控制核心.
S3C44B0X是SAMSUNG公司推出的16/32位RISIC處理器,它為手持設備和一般應用提供了高性價比和高性能的微控制器解決方案.SAMSUNG S3C44B0X微處理器芯片內集成ARM7TDMI核,并在ARM7TDMI核基本功能的基礎上集成了豐富的外圍功能模塊,便于低成本設計嵌入式應用系統(tǒng).這些外圍功能模塊包括:8 kB Cache;內部SRAM,LCD控制器;帶自動握手的2通道UART,4通道DMA;系統(tǒng)管理器;帶PWM功能的5通道定時器;I/O端口;具有日歷功能的實時時鐘RTC;8通道10位ADC;IIC總線接口;IIS總線接口;同步SIO接口;PLL倍頻器等.通過提供全面通用的片上外設,大大減少了系統(tǒng)中除處理器以外的原件配置,從而使系統(tǒng)成本大為降低[4].
設計中選用的開發(fā)板以S3C44B0X為控制核心,外部晶振頻率為10 MHz,內核主頻最高可達64 MHz,通過 RS232接口與上位機通訊,外接JTAG接口,支持在線調試.開發(fā)板采用SST39VF1601芯片(2 M字節(jié))作為程序存儲器,對應的地址空間為0x00000000-0x001fffff,采用HY57VF641620芯片(8 M字節(jié))作為數(shù)據(jù)存儲器,對應的地址空間為0x0c000000-0x0c7fffff.
系統(tǒng)引導裝載程序(Boot Loader)是在系統(tǒng)復位后執(zhí)行的第一段代碼,相當于PC機上的BIOS,以及商業(yè)實時操作系統(tǒng)中的板級支持包BSP.Boot Loader首先完成系統(tǒng)硬件的初始化,包括時鐘的設置、存儲區(qū)的映射,以及堆棧指針的設置等,然后跳轉到操作系統(tǒng)內核入口,將系統(tǒng)控制權交給操作系統(tǒng).此后系統(tǒng)的運行與Boot Loader再無任何關系[5].
在將Boot Loader程序燒入嵌入式開發(fā)板之前,通常都要被編譯成二進制文件(后綴名為.bin),這樣不僅能減少占用空間,還可以減少CPU的運算量.系統(tǒng)加電或復位后,所有的CPU通常都從某個由CPU制造商預先安排的地址上取指令.例如,基于ARM7TDMI核的CPU在復位時通常都從地址0x00000000取其第一條指令,而基于CPU構建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(ROM或FLASH等)被映射到這個預先安排的地址上.因此在系統(tǒng)加電后,CPU將首先執(zhí)行Boot Loader程序.
本設計中,將Boot Loader安放在FLASH中的0x1f000000地址,將中斷向量放在0x00000000的位置.Boot Loader完成系統(tǒng)初始化工作后,將內核的映像文件由Flash拷貝到SDRAM中,再從SDRAM中執(zhí)行μCLinux內核的引導程序,加載μCLinux內核.將內核的映射文檔從FLASH中的0x10000000地址處加載到 SDRAM 中的0xC0000000的地址處運行.引導程序操作模式如圖1所示.
圖1 引導程序操作模式
硬件環(huán)境確定以后,首先給μCLinux設計一個Boot Loader,通過Boot Loader來初始化硬件,引導μCLinux運行.然后針對硬件環(huán)境和設計的Boot Loader修改μClinux內核,并在Linux操作系統(tǒng)下建立編譯μCLinux的交叉編譯環(huán)境.最后配置、編譯、連接μCLinux,將下載編譯得到的映像文件存入Flash,并通過Boot Loader來啟動μCLinux.
一套包含編譯功能的集成開發(fā)環(huán)境IDE是嵌入式系統(tǒng)開發(fā)必不可少的,ADS IDE開發(fā)環(huán)境是常用的ARM編譯開發(fā)環(huán)境,是ARM公司推出的針對ARM芯片的編程開發(fā)界面,使用了Code Warrior公司的編譯器,它幾乎支持Windows的各種操作系統(tǒng).編譯完成后,可使用ARM擴展調試器(ARM eXtended Debugger,AXD)進行調試.其中,AXD是ADS中獨立于Code Warrior的圖形軟件.另外,嵌入式系統(tǒng)開發(fā)時需要一個交叉開發(fā)環(huán)境.交叉開發(fā)是指在一臺通用計算機上進行軟件編輯編譯,然后下載到嵌入式設備中運行調試的開發(fā)方式.移植前首先要準備好建立交叉開發(fā)環(huán)境的軟/硬件資源.
設計中,選擇交叉編譯工具 arm-elf-tools-20030314.sh.在 Linux環(huán)境,root用戶的 shell下執(zhí)行./arm-elf-tools-20030314.sh,即可建立起完整的交叉編譯環(huán)境.最后需添加交叉編譯器的路徑,在root用戶的shell下執(zhí)行export=$PATH:/usr/local/arm-elf/bin.
編譯過程中,首先要完成對Boot Loader的編譯.主要設置參數(shù)為:把 Post-linker設置成ARMFromelf;RO為0xc7c0000(從0xc7c0000地址開始為只讀數(shù)據(jù));RW為空;Object/Symbol為vector.o;section為Selfboot;設置輸出文件格式和保存路徑.
然后安裝 μCLinux源代碼并編譯.將壓縮μCLinux操作系統(tǒng)源代碼文件 μClinux-dist-20040408.tar.gz拷貝到 PC機上 linux操作系統(tǒng)的/usr/src目錄下,用 tarjxvfμClinux-dist-20040408.tar.gz命令解壓縮源代碼文件,產(chǎn)生/usr/src目錄下的/μClinux-dist子目錄,此目錄中含有編譯μCLinux操作系統(tǒng)的全部源文件.同時,根據(jù)開發(fā)板上的硬件配置,對μCLinux內核源代碼中與硬件緊密相關的部分作出適當?shù)男薷?
考慮到S3C4510B和S3C44B0X都屬于SAMSUNG公司生產(chǎn)的ARM7TDMI核的芯片,在很多硬件結構上都很類似.因而對照S3C4510B進行S3C44B0X的移植工作,下載針對S3C4510B的內核補丁程序后,對其作出相應的內核修改,并修正源代碼中的硬件參數(shù)設置,具體可以從修改壓縮內核運行地址、處理器配置選項及內核起始地址開始.修改內核起始地址的代碼如下:
#arch/armnommu/Makefile
#S3C44B0X
ifeq($(CONFIG_BOARD_SNDS100),y)
TEXTADDR=0x0c000000//內核的起始地址
MACHINE=S3C44B0X
INCDIR=$(MACHINE)
CORE_FILES:=$(CORE_FILES)#romfs.o
endif
配置超級終端波特率為57 600 Baud,無奇偶校驗,1位停止,無數(shù)據(jù)流控制.將一級中斷矢量文件boot.s從Boot Loader中分離出來,單獨進行編譯,生成二進制文件boot.bin后燒入到FLASH的起始地址0x00000000,而 Boot Loader仍放在FLASH的0x1f000000處.開發(fā)板在重新上電后復位,終端就出現(xiàn)了Boot Loader的啟動信息,如圖2所示.
圖2 Boot Loader啟動信息
在交叉編譯環(huán)境中完成μCLinux的編譯后,會產(chǎn)生一個二進制的內核文件image.bin,將其下載到SDRAM中的0xc0080000地址位置,并燒入FLASH中的0x10000000地址處,如圖3所示.
圖3 二進制內核文件燒入FLASH
由于FLASH的內存容量只有2 MB,所以內核的解壓運行不能在FLASH中直接進行,而需將其移入SDRAM中0xc0000000地址處(SDRAM的容量是8 MB),讓其在SDRAM起始位置處解壓運行μCLinux內核文件.將μCLinux映像文件燒入S3C44B0X開發(fā)板后,內核文件解壓、啟動過程如圖4所示.
圖4 內核文件解壓和啟動過程
對于嵌入式系統(tǒng)開發(fā)人員來說,經(jīng)常需要根據(jù)不同的硬件平臺移植嵌入式操作系統(tǒng),因而掌握移植方法非常重要.本文成功實現(xiàn)了將μCLinux嵌入式操作系統(tǒng)內核移植到ARM處理器芯片S3C44B0X中,該方法對μCLinux或μC/OS-II嵌入式操作系統(tǒng)移植到其他處理器為核心的硬件平臺具有很好的借鑒作用.
[1]周立功.ARM嵌入式系統(tǒng)實驗教程[M].北京:北京航空航天大學出版社,2005:279-290.
[2]馬忠敏,李善平,康慨,等.ARM&Linux嵌入式系統(tǒng)教程[M].北京:北京航空航天大學出版社,2004:10-30.
[3]任哲.嵌入式實時操作系統(tǒng)原理及應用[M].北京:北京航空航天大學出版社,2005:50-70.
[4]田澤.嵌入式系統(tǒng)開發(fā)與應用教程[M].北京:北京航空航天大學出版社,2005:290-294.
[5]李全利,張小麗.基于ARM的嵌入式 μCLinux系統(tǒng)開發(fā)[J].長春理工大學學報:自然科學版,2009,32(2):264-267.