嵌入式Linux系統的結構分為四個區,如圖所示:

1.Bootloader區存放的是Bootloader,Coidre972開發板上使用的uboot,它負責嵌入式系統最初的硬件初始化、驅動和內核加載。
2、參數區不是必須的,通常存放了一些系統參數,并且通常這個區是沒有文件系統,參數以原始數據的格式來存放。
3、內核鏡像區存放的Linux內核壓縮鏡像,它被解壓后運行于內存,作為嵌入式設備的Linux操作系統。
4、文件系統區存放經過壓縮的文件系統,它會被Linux內核解壓并掛載,并作為各種應用程序、文件的主要載體。
這4個區都以二進制數據的形式存放于嵌入式設備的Flash芯片上。由于參數區不下載,在實際的操作中只下載3個區即可:uboot、內核、和文件系統。
U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統引導。U-Boot從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋中能體現這一點。U-
Boot不僅僅支持嵌入式Linux系統的引導,它還支持NetBSD, 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
上電自檢文件目錄。尚有待于進一步完善;
* 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型號;
工作模式
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)。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(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的工作循環),接受用戶從串口輸入的命令,然后進行相應的工作。