U-Boot

U-Boot

U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統引導。U-Boot從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的註釋中能體現這一點。

項目簡介


U-Boot
U-Boot
U-Boot不僅僅支持嵌入式Linux系統的引導,它還支持NetBS D, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系統。其目前要支持的目標操作系統是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、 x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個特點正是U-Boot項目的開發目標,即支持儘可能多的嵌入式處理器和嵌入式操作系統。就目前來看,U-Boot對PowerPC系列處理器支持最為豐富,對Linux的支持最完善。其它系列的處理器和操作系統基本是在2002年11 月PPCBOOT改名為U-Boot后逐步擴充的。從PPCBOOT向U-Boot的順利過渡,很大程度上歸功於U-Boot的維護人德國DENX軟體工程中心Wolfgang Denk[以下簡稱W.D]本人精湛專業水平和執著不懈的努力。當前,U-Boot項目正在他的領軍之下,眾多有志於開放源碼BOOT LOADER移植工作的嵌入式開發人員正如火如荼地將各個不同系列嵌入式處理器的移植工作不斷展開和深入,以支持更多的嵌入式操作系統的裝載與引導。
選擇U-Boot的理由:
① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;

目錄結構


* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;
(以上關於目錄結構的說明只適應u-boot-2010.06之前版本。u-boot-2010.06之後目錄結構改變
1.cpu與lib_arch合二為一,命名arch
2.增加include folder
3.分離出通用庫文件夾lib

主要功能


U-Boot可支持的主要功能列表:
*系統引導支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統;支持NFS掛載、從FLASH中引導壓縮或非壓縮系統內核;
* 基本輔助功能強大的操作系統介面功能;可靈活設置、傳遞多個關鍵參數給操作系統,適合系統在不同開發階段的調試要求與產品發布,尤以Linux支持最為強勁;支持目標板環境參數多種存儲方式,如FLASH、NVRAM、EEPROM;
* CRC32校驗可校驗FLASH中內核、RAMDISK鏡像文件是否完好;
* 設備驅動串口、SDRAM、FLASH、乙太網、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅動支持;
* 上電自檢功能SDRAM、FLASH大小自動檢測;SDRAM故障檢測;CPU型號;
* 特殊功能XIP內核引導;

工作模式


U-Boot的工作模式有啟動載入模式和下載模式。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。下載模式就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的FLASH中。用戶可以利用Bootloader提供的一些命令介面來完成自己想要的操作。

啟動流程


大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用彙編語言來實現,而stage2則通常用C語言來實現,這樣可以實現複雜的功能,而且有更好的可讀性和移植性。
1、stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用彙編語言寫成,其主要代碼部分如下:
(1)定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鐘頻率及中斷控制寄存器。
(4)初始化內存控制器
(5)將rom中的程序複製到ram中。
(6)初始化堆棧。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。
2、stage2(C語言代碼部分)
lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。

支持功能


支持文件系統

● Cramfs
● ext2
● FAT
● FDOS
● JFFS2
● ReiserFS
● UBIFS
● YAFFS2

歷史發展

這個項目起源於Magnus Damm.在8xx PowerPC架構下寫的引導載入程序:8xxROM。1999年十月,Wolfgang Denk將項目移轉到SourceForge.net,但SourceForge.net不允許數字開頭的項目名稱,所以改名為PPCBoot。PPCBoot在2000年7月19日第一次公開發布0.4.1版。