摘要:
介紹U-boot功能和特點,并以ARM9板MagicArm2410和嵌入式Linux為背景,探討U-boot的移植方法與要點。
關鍵詞:引導加載程序; U-boot; 嵌入式Linux; 移植
中圖分類號:TP316.81文獻標志碼:A
文章編號:1001-3695(2007)12-0238-03
1Bootloader介紹
目前在一些專用板上運行Linux已經越來越流行,從軟件角度看一個嵌入式Linux系統可分為四個層次,即Bootloader、kernel(Linux內核)、root filesystem(根文件系統)和用戶應用程序。
引導加載程序(Bootloader)是系統加電后運行的第一段軟件代碼。它的主要運行任務就是將內核映像從硬盤讀入RAM中,然后跳轉到內核的入口點去運行,即開始啟動操作系統。在嵌入式系統中,通常并沒有PC機上BIOS那樣的固件程序(有的嵌入式CPU也會內嵌一段短小的啟動程序)。因此整個系統的加載啟動任務就完全由Bootloader來完成。通過這段小程序可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境設置為一個合適的狀態。通常,Bootloader是嚴重地依賴于硬件而實現的,特別是在嵌入式世界。因此,在嵌入式世界中建立一個通用的Bootloader幾乎是不可能的。
1.1Bootloader所支持的CPU和嵌入式板
不同的CPU體系結構均有不同的Bootloader,但是有些Bootloader也支持多種體系結構的CPU。要想讓運行在一塊嵌入式板上的Bootloader程序也能運行在另一塊嵌入式板上,通常需要修改Bootloader的源程序。
1.2Bootloader的安裝媒介
系統加電或復位后,通常所有的CPU都從某個由CPU制造商預先安排的地址上取指令。比如,基于ARM7TDMI core的CPU在復位時通常都從地址0x00000000取它的第一條指令。基于CPU構建的嵌入式系統通常都有某種類型的固態存儲設備(如ROM、E2PROM或flash等)被映射到這個預先安排的地址上。因此在系統加電后,CPU將首先執行Bootloader程序。
圖1是一個同時裝有Bootloader、內核的啟動參數、內核映像和根文件系統映像的固態存儲設備的典型空間分配結構圖。
1.3用來控制Bootloader的設備或機制
主機與目標機之間一般通過串口建立連接。Bootloader軟件在執行時通常會通過串口來進行I/O。
1.4Bootloader的操作模式
1)啟動加載(bootloading)模式也稱為自主模式,即Boot-loader從目標機上的某個固態存儲設備上將操作系統加載到RAM中運行,整個過程并無用戶介入。嵌入式產品發布時Bootloader顯然必須工作在這種模式下。
2)下載(downloading)模式目標機上的Bootloader將通過串口連接或網絡連接等通信手段從主機(host)下載文件,如下載內核映像和根文件系統映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被Boot-loader寫到目標機上的flash類固態存儲設備中。
1.5Bootloader與主機進行文件傳輸所用通信設備及協議
最常見的情況就是,目標機上的Bootloader通過串口與主機之間進行文件傳輸,傳輸協議通常是xmodem/ymodem/zmodem協議中的一種。但是,串口傳輸的速度是有限的,因此通過以太網連接并借助TFTP 協議來下載文件是個更好的選擇,這也是U-boot所采用的方式。
1.6Bootloader的主要任務與典型結構框架
從操作系統的角度看,Bootloader的總目標就是正確地調用內核來執行。另外,Bootloader的實現依賴于CPU的體系結構,因此大多數Bootloader都分為stage1和stage2兩大部分。依賴于CPU體系結構的代碼,如設備初始化代碼等,通常都放在stage1中,用匯編語言來實現。通常stage2用C語言來實現。這樣可以實現更復雜的功能,代碼會具有更好的可讀性和可移植性。
2U-boot簡介
U-boot(universal boot loader)是遵循GPL條款的開放源碼項目。它不僅僅支持嵌入式Linux系統的引導,還支持NetBSD、VxWorks、QNX、RTEMS、ARTOS和LynxOS嵌入式操作系統。這是U-boot中Universal的一層含義,另外一層含義則是U-boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個特點正是U-boot項目的開發目標,即支持盡可能多的嵌入式處理器和嵌入式操作系統。就目前來看,U-boot對PowerPC系列處理器支持最為豐富,對Linux的支持最完善。
2.1U-boot主要目錄結構
了解U-boot源代碼的目錄結構是非常重要的,因為在向開發板上移植時,往往需要結合具體板的信息來作出相應的修改。而如何修改、在何處修改就需要對U-boot的目錄結構有很深的認識。以下是它的目錄結構以及目錄存放代碼的用途:
board—已經有的目標板相關文件,主要包含SDRAM、flash驅動,如Makefile,U-boot.lds等均與具體開發板的硬件和地址分配有關。
common—獨立于處理器體系結構的通用代碼,與體系結構無關,實現各種命令的C文件。
cpu—與處理器相關的文件其中的子目錄均是以U-boot所支持的CPU為名,如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件,start.S是U-boot啟動時執行的第一個文件,它主要是設置系統堆棧和工作方式,為進入C程序奠定基礎。
disk—disk驅動的分區處理代碼。
driver—通用設備驅動,如CFI flash驅動、網卡驅動。
doc—U-boot的說明文檔。
fs—支持文件系統的文件,U-boot現在支持cramfs、fat、fdos、jffs2和registerfs。
examples—可在U-boot下運行的示例程序。
include—U-boot頭文件,尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件。
lib_xxx—處理器體系相關的文件,如lib_ppc、lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件。
net—與網絡功能相關的文件目錄,如bootp、nfs、tftp等協議的實現。
post—上電自檢文件目錄,尚有待于進一步完善。
rtc—RTC驅動程序。
lib_arm—與ARM體系結構相關的代碼。
tools—用于創建U-boot S-Record和BIN鏡像文件的工具。
2.2U-boot支持的主要功能
3U-boot的移植
本文主要探討以MagicArm2410為例來移植U-boot的過程,使得大部分開發板移植U-boot作為BootLoader時可以參照。關于如何在Linux環境下建立arm開發環境不進行過多贅述。這里操作系統采用Fedora core4,交叉編譯器為arm-Linux2.95.3。
3.1建立開發板所需要的文件
在U-boot的board目錄下就是其支持的開發板,數量非常多。這里用到的MagicARM2410是在三星公司的smdk2410開發板的基礎上做出的,所以在這選擇smdk2410這款相近的開發板來作相應的修改。
3.1.1在board下建立開發板目錄
#mkdir magicarm2410
#cp smdk2410/* magicarm2410
Magic2410目錄下包含了以下幾個文件:flash.c、lowlevel_init.S、smdk2410.c、u-boot.lds、config.mk和Makefile。
3.1.2建立開發板的硬件信息頭文件
#cd include/configs
#cp smdk2410.h magicarm2410.h
Magicarm2410.h這個文件中定義了開發板很多的硬件信息。
3.2結合具體開發板修改文件
一般來說,雖然U-boot可以支持很多開發板,但是在開發時有些文件還是要注意結合開發板的具體信息來修改,以下是需要注意修改的幾個地方。
3.2.1開發板的配置文件
這個文件就是剛才建立的/include/configs/magicarm2410.h。它包括開發板的CPU、系統時鐘、RAM、flash系統及其他相關的配置信息。由于是復制的smdk2410.h文件,只要參照修改以下幾處:
a)配置這里主要是為了以后下載Linux內核文件,只要保證開發板和Linux主機處于同一網段即可。
#define CONFIG_ETHADDR 00:14:97:0f:0c:de
/*開發板的網卡MAC地址*/
#define CONFIG_NETMASK 255.255.255.0
/*子網掩碼*/
#define CONFIG_IPADDR 192.168.0.1
/*開發板的ip地址*/
#define CONFIG_SERVERIP 192.168.0.2
/*Linux主機的地址*/
b)配置開發板的內存,即SDRAM。
#define CONFIG_NR_DRAM_BANKS1
/* 一塊DRAM */
#define PHYS_SDRAM_10x30000000
/*參照數據手冊得出*/
#define PHYS_SDRAM_1_SIZE0x04000000
/*這個開發板的SDRAM為64 MB*/
c)配置flash的大小,根據數據手冊提供的數據,至于sector的數量是根據/board/magicarm2410/flash.c中的flash_init()函數計算出來的。
#define PHYS_FLASH_SIZE0x00200000
/* 這個開發板有2 MB的NorFlash*/
#define CFG_MAX_FLASH_SECT(35)
/* flash上sector的數量*/
d)如果采用的開發板和所選擇的規格相近的開發板網卡不同,還需要修改配置網卡信息。
#define CONFIG_DRIVER_DM90001
/* 網卡是DM9000 */
#define CONFIG_DM9000_BASE0x08000300
/*網卡硬件地址,參照數據手冊*/
#define DM9000_IOCONFIG_DM9000_BASE
/*網卡I/O端口*/
#define DM9000_DATA CONFIG_DM9000_BASE+4
/*網卡數據端口*/
3.2.2修改makefile文件
U-boot的makefile文件包含了它所支持的開發板,但是這里用到的MagicARM2410并沒有,所以需要添加進去。添加如下:
magicarm2410_config:unconfig
@./mkconfig S(@:_config=) arm arm920t magicarm2410 NULL s3c24x0
這里每個項的意義可以參看U-boot下的mkconfig文件,它的說明如下:
#Parameters:Target Architecture CPU Board [VENDOR] [SOC]
其中:arm是CPU的種類;arm920t是ARM CPU對應的代碼目錄;MagicARM2410是自己開發板對應的目錄;s3c24x0對應的SOC。
3.2.3修改flash.c文件
如果開發板的flash和所選擇的相近開發板并不相同,就需要在/board/magicarm2410/flash.c作相應修改。這里主要修改flash型號,即修改flash_init()和flash_print_info()兩個函數中的flash型號為自己開發板的型號。關于其他內容參見flash的數據手冊修改。
3.3編譯生成目標文件
運行make mrproper(或用distclean);make magicarm2410_config;make最后得到三個文件:
a)U-boot—ELF格式的文件;
b)U-boot.bin—二進制bin文件,純粹的U-boot二進制執行代碼,不保存ELF格式和調試信息,這個文件一般用于燒錄到用戶開發板中;
c)U-boot.srec—Motorola S-Record格式,可以通過串行口下載到開發板中。
3.4下載Bootloader并啟動
通過JTAG將U-boot.bin燒寫到flash的零地址,然后重新啟動,若正常就會從串口看到如下信息,說明Bootloader已經運行了:
U-boot 1.1.4 (May 30 2006-16:01:47)
U-Boot code: 33A00000->33A18A58BSS:->33A1CBD0
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 2 MB
In: serial
Out: serial
Err: serial
4結束語
U-boot能夠支持多種體系結構的處理器,支持的開發板也越來越多。因為Bootloader完全依賴硬件平臺,所以在新電路板上需要移植U-boot程序。目前U-boot最新的版本是1.1.4,對于沒有包括的或者新的開發板,處理的辦法就是選擇一款相近的開發板,在其基礎上進行相應的修改。
根據以上的具體開發過程,可以得出向其他開發板移植U-boot的經驗,即移植U-boot的工作就是添加開發板硬件相關的文件、配置文件,然后配置編譯。
開始移植之前,先要熟悉硬件電路板和處理器,確認U-boot是否支持新開發板的處理器和I/O設備,最好是 U-boot已經支持一塊非常相似的電路板。這就需要先分析一下U-boot已經支持的開發板,比較出硬件配置最接近的開發板。選擇的原則是,首先處理器相同,其次處理器體系結構相同,然后是以太網接口等外圍接口。還要驗證一下這個參考開發板的U-boot,也要編譯通過。比如本文用到的MagicARM2410,U-boot已經支持與之相近的SMDK2410,就可以基于SMDK2410移植。
Bootloader是操作系統和硬件的樞紐,開發人員除了要掌握Bootloader的結構和工作流程外,還要對相關硬件有一定的了解,所以從頭來構建Bootloader是非常麻煩的。如果基于U-boot構建嵌入式Linux的Bootloader,就可以極大地簡化開發過程。
本文通過對U-boot移植過程的探討,給出了一個針對大多數開發板的操作步驟,在U-boot正常運行以后,便可下載Linux內核和文件系統,進行下一步開發,從而縮短開發周期。
參考文獻:
[1]廖日坤.ARM嵌入式應用開發技術白金手冊[K].北京:中國電力出版社, 2005.
[2]杜春雷.ARM體系結構與編程[M].北京:清華大學出版社, 2003.
[3]毛德操,胡希明.嵌入式系統—采用公開源碼和StrongARM/Xscale處理器[M].杭州:浙江大學出版社,2003.
[4]孫紀坤,張小全.嵌入式Linux系統開發技術詳解—基于ARM[M].北京:人民郵電出版社,2006.
[5]葉順流.基于ARM的嵌入式Linux的研究與實現[D].重慶:重慶大學,2005:30-41.
[6]羅奕.嵌入式Linux裁減及其系統構建的研究與實現[D].長沙:中南大學,2005:15-21.
[7]王亞剛.嵌入式Linux系統移植與裁減技術研究[D].西安:西北大學,2005:19-40.
[8]YAGHMOUR K. Building embedded Linux system[M].[S.l.]: O’Reilly Media, 2004.
“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”