摘要:EP7312是CIRRUS LOGIC公司設計的一款基于ARM720MTDMI的內(nèi)核處理器。實驗以PC機為宿主機,通過在宿主機上對uClinux內(nèi)核進行編譯,然后向目標板EP7312移植。從交叉編譯環(huán)境的建立、uClinux的下載與運行等方面,系統(tǒng)描述了uClinux在EP7312開發(fā)板上的移植過程。
關鍵詞:EP7312;uClinux;移植;內(nèi)核;bootloader
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)32-1238-02
Transplant of UClinux Based on EP7312
ZHANG Shu-ping
(College of Science Technology, XinJiang University, Urumqi 830049, China)
Abstract: Ep7312 is a kind of Processor based on the architecture of RM720MTDMI designed by the CIRRUS LOGIC Corporation.This experimentation compiles The kernel of uClinux via a host(general-purpose computer) and transplants it to the target EP7312 board.the building of cross compilation environment ,compilation of krenel,,download and implemention of the uClinux are introduced in this paper,the transplant ofuClinux based on EP7312 is systemically described.
Key words: EP7312; uClinux; transplant; kernel; bootloader
1 引言
隨著嵌入式技術(shù)的迅速普及,Linux由于其開放的源代碼、低成本、高穩(wěn)定性等特點成為了嵌入式領域里發(fā)展最迅速的操作系統(tǒng)。而EP7312是CIRRUS LOGIC公司設計的一款基于ARM720MTDMI的內(nèi)核處理器,將uClinux移植到EP7312處理器平臺對于構(gòu)建高性能的、通用的嵌入式開發(fā)平臺具有極大的價值。
2 uClinux 操作系統(tǒng)簡介
uclinux即“微控制器領域中的Linux系統(tǒng)”。 uClinux從Linux 2.0/2.4內(nèi)核派生而來,沿襲了Linux的絕大部分特性。它是專門針對沒有MMU(內(nèi)存管理單元)的CPU,并且為嵌入式系統(tǒng)做了許多小型化的工作。它通常用于具有很少內(nèi)存或Flash的嵌入式操作系統(tǒng)。在GNU通用許可證的保證下,運行uClinux操作系統(tǒng)的用戶可以使用幾乎所有的Linux API函數(shù)。由于經(jīng)過了裁剪和優(yōu)化,它形成了一個高度優(yōu)化,代碼緊湊的嵌入式Linux。它具有體積小、穩(wěn)定、良好的移植性、優(yōu)秀的網(wǎng)絡功能、完備的對各種文件系統(tǒng)的支持,以及豐富的API函數(shù)等優(yōu)點。uClinux與Linux在兼容性方面表現(xiàn)出色,uClinux除了不能實現(xiàn)fork()外,其余uClinux的API函數(shù)與標準Linux完全相同。
3 硬件平臺
基于uClinux 操作系統(tǒng)的應用開發(fā)環(huán)境一般是有目標系統(tǒng)硬件開發(fā)板和宿主PC機所構(gòu)成的。如圖1所示目標系統(tǒng)硬件開發(fā)板用于運行操作系統(tǒng)和系統(tǒng)應用軟件,而目標板所用到的操作系統(tǒng)的內(nèi)核編譯、應用程序的開發(fā)和調(diào)試則需要通過宿主PC機來完成。主機端的PC機使用COM1口與目標板EP7312的串口相連,發(fā)送控制指令和傳輸數(shù)據(jù),并且通過RS232串口完成對目標板EP7312控制、傳輸、下載、調(diào)試等,內(nèi)核啟動可以通過以太網(wǎng)控制通訊實現(xiàn)NFS服務。
4 軟件環(huán)境
軟件環(huán)境要解決的問題是在工作站(x86處理器,redhat9.0 )的環(huán)境中建立起一套軟件,這套軟件把針對目標開發(fā)平臺的源代碼編譯成可以在開發(fā)平臺上運行的二進制代碼。這套軟件主要包括三個部分:arm-elf-binutils,arm-elf-gcc,uclibc.其中binutils是二進制文件的處理工;arm-elf-gcc是編譯工具;uclibc是鏈接和運行庫。
5 uClinux 操作系統(tǒng)的移植
5.1 建立交叉編譯環(huán)境
在www.uclinux.org上下載arm-elf-tools-20030314.sh,在宿主機上安裝此工具鏈,在該文件所在目錄下鍵入:
$su
#chmod 755 arm-elf-tools-20030314.sh
#ls-l arm-elf-tools-20030314.sh
#./arm-elf-tools-20030314.sh
執(zhí)行程序的安裝后??蓤?zhí)行文件按會被默認安裝在/usr/local/bin目錄下。
5.2 交叉編譯uClinux的內(nèi)核
uClinux是一款支持無MMU單元的嵌入式操作系統(tǒng),從官方網(wǎng)站獲取內(nèi)核文件(www.uclinux.org)。使用tar工具解壓內(nèi)核文件。 $tar xvzf uClinux-dist-20030522.tar.gz
經(jīng)過一段時間的解壓后將在工作目錄下會生成uClinux-dist文件夾。 在編譯內(nèi)核之前我們首先要做的是配置內(nèi)核,常用的配置方式有三種:
make xconfig - X Windows圖形界面的配置選項;
make menuconfig - Console圖形界面的配置選項;
make config - 命令接口的配置選項; 在這里需要注意的是uClinux是不支持loadable modules的,因此應該取消對該模塊的支持。
$cd uClinux-dist/
$ make menuconfig
配置你需要的選項,比如處理器類型,開發(fā)板類型,內(nèi)核版本等。配置好之后選擇Saving and Exiting保存退出。
編譯uClinux內(nèi)核的常用選項有:
make distclean該命令將清除以前編譯時候產(chǎn)生的文件,包括.config文件,所有目標文件以及內(nèi)核映象文件。
make clean該命令與make distclean相似,也是清除之前編譯時候產(chǎn)生的文件。
make dep 這個只需要在第一次編譯的時候執(zhí)行,為了是建立文件之間的依賴關系,make命令會根據(jù)這個依賴關系來確定哪些文件需要重新編譯,哪些文件可以跳過。
make lib_only 編譯uClibc庫
make user_only 編譯用戶制定的應用程序,比如初始化進程init,bash,以及集成了很多常用工具的嵌入式軟件包busybox。
make romfs uClinux經(jīng)常才用romfs(只讀文件系統(tǒng))來作為系統(tǒng)的根文件系統(tǒng),所以首先需要將之前編譯的很多應用程序以uClinux所需要的目錄格式存放起來。比如將可執(zhí)行文件放在bin目錄下,將配置文件放在etc目錄下。該命令執(zhí)行后會在uClinux-dist目錄下生成一個romfs的目錄,并且將文件系統(tǒng)所需要的文件組織起來,以便之后生成fomfs的映象文件。
make image 生成romfs文件系統(tǒng)的映象文件,以及l(fā)inux的映象文件。該linux的映象文件是elf格式的,是不能直接下載到開發(fā)板上執(zhí)行的(里面包含了大量的調(diào)試信息,elf文件執(zhí)行前的環(huán)境建立信息等內(nèi)容。該文件可以使用arm-elf-objcopy工具來生成可以直接在RAM中執(zhí)行的binary文件)。
make linux執(zhí)行該命令之后將生成linux內(nèi)核文件。
make zImage建立經(jīng)過gzip算法壓縮過的內(nèi)核映象文件,通常zImage產(chǎn)生的內(nèi)核映象文件無法超過512KB大小。
make modules 建立內(nèi)核模塊
注:有些uClinux版本提供了更多的編譯方式,比如make linux.bin。關于其他的編譯方式可以參看內(nèi)核源碼目錄里的Makefile文件。
在介紹完常用的幾個內(nèi)核編譯命令后,我們使用如下的幾個命令來建立我們所需要的內(nèi)核以及文件系統(tǒng):
make dep
make clean
make all
這樣在uClinux-dist/linux-2.4.x目錄下會生成linux, System.map,在uClinux-dist/images/目錄下會生成image.bin, linux.bin, image.ram, image.rom, romfs.img, linux.text, linux.data等文件。其中image.ram是直接可以下載到ram中執(zhí)行的文件。在調(diào)試階段可以使用該文件。 image.rom是一個zImage文件,可以自解壓的內(nèi)核,該文件需要少寫到FLASH里,而不能直接放入RAM中執(zhí)行。
6 uClinux的下載與執(zhí)行
uClinux的內(nèi)核可以通過FLASH燒寫工具寫入,F(xiàn)LASH中(分別將boot, image. rom和romfs. img燒進Flash)。嵌人式系統(tǒng)引導過程通??梢苑譃閎oot、系統(tǒng)初始化和uClinux內(nèi)核引導三個階段。通常情況下,boot階段和系統(tǒng)初始化階段的工作由一段被稱為bootloader的代碼完成,而內(nèi)核引導則是由事先編譯好了的uClinux可執(zhí)行鏡像來實現(xiàn)。
6.1boot
Bootloader:就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序。這段程序可以初始化硬件設備,建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。
6.2 系統(tǒng)初始化
系統(tǒng) 初 始 化階段的主要工作是建立與主機間的通信、初始化定時器、檢測內(nèi)存映射、加載uClinux內(nèi)核鏡像和配置內(nèi)核啟動參數(shù)等。加載uClinux內(nèi)核工作實際上是完成從Flash中將壓縮格式的內(nèi)核映像加載到SDRAM。
6.3 uClinux內(nèi)核引導
初始化階段完成uClinux啟動參數(shù)設置后,控制權(quán)交由uClinux內(nèi)核接管,并調(diào)用解壓內(nèi)核函數(shù)decompress- kernel,對加載到SDRAM的內(nèi)核映像文件進行解壓縮,然后跳轉(zhuǎn)到內(nèi)核調(diào)用函數(shù)callkernel,該函數(shù)實際上是執(zhí)行start-kernel(),其中包括了處理器結(jié)構(gòu)的初始化、中斷的初始化、進程相關的初始化以及內(nèi)存初始化等重要工作。最后將控制權(quán)交給解壓后的uClinux系統(tǒng),進而完成整個uClinux內(nèi)核引導過程。
7 結(jié)束語
目前,筆者移植的uclinux已經(jīng)能夠穩(wěn)定地運行在ep7312開發(fā)板上,這使得基于該平臺的嵌入式應用程序的開發(fā)有了OS基礎,為嵌入式軟件設計節(jié)約了大量的開發(fā)時間,為后續(xù)嵌入式軟件開發(fā)提供了大力支持。
參考文獻:
[1] 魏忠.嵌入式開發(fā)詳解[M].北京:電子工業(yè)出版社,2003.
[2] 李巖.基于S3C44BOX嵌入式uClinux系統(tǒng)原理及應用[M].北京:清華大學出版社,2005.
[3] 劉崢嶸.嵌入式Linux應用開發(fā)詳解[M].北京:機械工業(yè)出版社,2004.
[4] 鄒思鐵. 嵌入式Linux設計與應用[M].北京:清華大學出版社,2002.
[5] 王田苗.嵌人式系統(tǒng)設計與實例開發(fā)[M].北京:清華大學出版社,2003.