基于PxA255的U-B00t啟動(dòng)分析及移植
摘要:Bootloader在嵌入式系統中是必不可少的重要組成部分,這里使用U-Boot 1.3.O在基于PXA255的嵌入式系統上,構建引導加載程序。在對目標板的硬件資源進(jìn)行簡(jiǎn)要說(shuō)明之后,詳細分析了U-Boot的啟動(dòng)流程;接著(zhù)從參考板的選擇、目標板支持文件的建立和相關(guān)代碼的修改,闡述移植的全過(guò)程;最后給出了編譯和調試的方法。結果表明,U-Boot能穩定地運行。將U-Boot移植到自制的以PXA255為處理器的目標板上,并能成功引導Linux內核,該目標板已經(jīng)應用于無(wú)線(xiàn)傳感器網(wǎng)絡(luò )的匯聚節點(diǎn),取得了良好的效果。
關(guān)鍵詞:U-Boot;PXA255;Bootloader;嵌入式系統;軟件移植
0 引 言
Bootloader是操作系統運行之前執行的一小段程序,用來(lái)初始化硬件設備,建立一個(gè)系統空間映射圖和一個(gè)適當的系統軟硬件環(huán)境。最終Bootloader把操作系統內核映像加載到RAM中。并將系統控制權交給內核。
U-Boot被認為是功能最多,最具彈性以及開(kāi)發(fā)最積極的開(kāi)放源碼Bootloader。U-Boot已經(jīng)能夠支持PowerPC,ARM,X86和MIPS體系結構的上百種開(kāi)發(fā)板,U-Boot還具有通過(guò)TFTP,從IDE或SCSI磁盤(pán)以及DOc啟動(dòng)的能力,還提供了JFFS2的只讀功能。正是由于U-Boot較高的可靠性和穩定性;高度靈活的功能設置;豐富的設備驅動(dòng)程序和豐富的開(kāi)發(fā)和調試文檔,因此選擇U-Boot作為目標板的Boot-loader。
對于嵌入式系統,Bootloader是基于特定的硬件來(lái)實(shí)現的,因此建立一個(gè)通用的。Bootloader是不可能的,要使Bootloader能在目標板上運行,必須做出相應的修改。
l 目標板
目標板采用Intel PXA255處理器,頻率最高可達400 MHz,配置了32 MB的FLASH(Intel StrataFLASH)和64 MB的SDRAM(Samsung),網(wǎng)卡采用LAN91C96。板上有JTAG口、串口和網(wǎng)口,可分別完成程序的下載和調試工作。目標板的主要硬件資源如圖1所示。
2 U-Boot啟動(dòng)過(guò)程分析
充分理解代碼的啟動(dòng)流程,對于準確地判斷出移植過(guò)程中出錯的原因和出錯的位置具有重要的作用。
2.1 U-Boot啟動(dòng)的入口點(diǎn)
一個(gè)可執行的Image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口??蓤绦蠭mage的入口一般通過(guò)鏈接腳本文件來(lái)實(shí)現,鏈接腳本主要用于規定如何把文件內的section放入輸出映像文件內,并控制輸出文件內各個(gè)部分在程序地址空間內的分布。鏈接腳本文件位于board目錄下的各個(gè)開(kāi)發(fā)板目錄。
以U-Boot支持的開(kāi)發(fā)板1ubbock為例,查看鏈接腳本board/lubbock/u-boot.lds,就可以知道各個(gè)部分的鏈接順序。這個(gè)連接腳本決定了U-Boot的第一階段的代碼是從0xO開(kāi)始的,入口由_start符號指定(ENTRY(_start)),第一個(gè)鏈接的文件是cup/pxa/start.o,那么U-Boot的入口指令一定位于這個(gè)程序中。
2.2 U-Boot的啟動(dòng)步驟
U―Boot的啟動(dòng)一般分為stagel和stage2兩個(gè)部分。依賴(lài)于CPU體系結構的代碼,通常用匯編語(yǔ)言實(shí)現,放在stagel;而stage2則通常用C語(yǔ)言來(lái)實(shí)現,這樣可以實(shí)現復雜的功能,而且有更好的可讀性和移植性。
根據對鏈接腳本文件和源代碼的分析,U-Boot的啟動(dòng)過(guò)程中函數調用的順序如圖2所示。
2.2.1 stagel部分
U-Boot的stagel代碼從人口函數start.S開(kāi)始,它用匯編語(yǔ)言寫(xiě)成,主要完成的工作為:設置異常向量;設置CPu的速度、時(shí)鐘頻率及中斷控制寄存器;初始化內存控制器;將ROM中的程序復制到RAM中;初始化堆棧;轉到RAM中執行。
評論