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