嵌入式Linux系統(tǒng)的結(jié)構(gòu)分為四個(gè)區(qū),如圖所示:
1.Bootloader區(qū)存放的是Bootloader,Coidre972開(kāi)發(fā)板上使用的uboot,它負(fù)責(zé)嵌入式系統(tǒng)最初的硬件初始化、驅(qū)動(dòng)和內(nèi)核加載。
2、參數(shù)區(qū)不是必須的,通常存放了一些系統(tǒng)參數(shù),并且通常這個(gè)區(qū)是沒(méi)有文件系統(tǒng),參數(shù)以原始數(shù)據(jù)的格式來(lái)存放。
3、內(nèi)核鏡像區(qū)存放的Linux內(nèi)核壓縮鏡像,它被解壓后運(yùn)行于內(nèi)存,作為嵌入式設(shè)備的Linux操作系統(tǒng)。
4、文件系統(tǒng)區(qū)存放經(jīng)過(guò)壓縮的文件系統(tǒng),它會(huì)被Linux內(nèi)核解壓并掛載,并作為各種應(yīng)用程序、文件的主要載體。
這4個(gè)區(qū)都以二進(jìn)制數(shù)據(jù)的形式存放于嵌入式設(shè)備的Flash芯片上。由于參數(shù)區(qū)不下載,在實(shí)際的操作中只下載3個(gè)區(qū)即可:uboot、內(nèi)核、和文件系統(tǒng)。
U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開(kāi)放源碼項(xiàng)目。U-Boot的作用是系統(tǒng)引導(dǎo)。U-Boot從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來(lái)。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進(jìn)行簡(jiǎn)化而形成的,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。U-
Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),它還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是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等諸多常用系列的處理器。這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開(kāi)發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前來(lái)看,U-Boot對(duì)PowerPC系列處理器支持最為豐富,對(duì)Linux的支持最完善。其它系列的處理器和操作系統(tǒng)基本是在2002年11 月PPCBOOT改名為U-Boot后逐步擴(kuò)充的。從PPCBOOT向U-Boot的順利過(guò)渡,很大程度上歸功于U-Boot的維護(hù)人德國(guó)DENX軟件工程中心Wolfgang Denk[以下簡(jiǎn)稱W.D]本人精湛專業(yè)水平和執(zhí)著不懈的努力。當(dāng)前,U-Boot項(xiàng)目正在他的領(lǐng)軍之下,眾多有志于開(kāi)放源碼BOOT LOADER移植工作的嵌入式開(kāi)發(fā)人員正如火如荼地將各個(gè)不同系列嵌入式處理器的移植工作不斷展開(kāi)和深入,以支持更多的嵌入式操作系統(tǒng)的裝載與引導(dǎo)。
選擇U-Boot的理由:
① 開(kāi)放源碼;
② 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;
③ 支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS;
④ 較高的可靠性和穩(wěn)定性;
⑤ 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
目錄結(jié)構(gòu)
* board
目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動(dòng);
* common 獨(dú)立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測(cè)與故障檢測(cè);
* cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動(dòng)及中斷初始化等文件;
* doc U-Boot的說(shuō)明文檔;
* examples可在U-Boot下運(yùn)行的示例程序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與
目標(biāo)板相關(guān)的配置頭文件是移植過(guò)程中經(jīng)常要修改的文件;
* lib_xxx 處理器體系相關(guān)的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;
* net 與網(wǎng)絡(luò)功能相關(guān)的
文件目錄,如bootp,nfs,tftp;
* post
上電自檢文件目錄。尚有待于進(jìn)一步完善;
* tools 用于創(chuàng)建U-Boot S-RECORD和BIN
鏡像文件的工具;
(以上關(guān)于目錄結(jié)構(gòu)的說(shuō)明只適應(yīng)u-boot-2010.06之前版本。u-boot-2010.06之后目錄結(jié)構(gòu)改變
1.cpu與lib_arch合二為一,命名arch
2.增加include folder
3.分離出通用庫(kù)文件夾lib
)
U-Boot可支持的主要功能列表:
*系統(tǒng)引導(dǎo)支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的
根文件系統(tǒng);支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)
內(nèi)核;
* 基本輔助功能強(qiáng)大的
操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開(kāi)發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤以Linux支持最為強(qiáng)勁;支持
目標(biāo)板環(huán)境參數(shù)多種存儲(chǔ)方式,如FLASH、NVRAM、EEPROM;
* CRC32校驗(yàn)可校驗(yàn)FLASH中內(nèi)核、RAMDISK
鏡像文件是否完好;
*
上電自檢功能SDRAM、FLASH大小自動(dòng)檢測(cè);SDRAM故障檢測(cè);CPU型號(hào);
工作模式
U-Boot的工作模式有啟動(dòng)加載模式和下載模式。啟動(dòng)加載模式是Bootloader的正常工作模式,嵌入式產(chǎn)品發(fā)布時(shí),Bootloader必須工作在這種模式下,Bootloader將
嵌入式操作系統(tǒng)從FLASH中加載到SDRAM中運(yùn)行,整個(gè)過(guò)程是自動(dòng)的。下載模式就是Bootloader通過(guò)某些通信手段將
內(nèi)核映像或
根文件系統(tǒng)映像等從PC機(jī)中下載到
目標(biāo)板的FLASH中。用戶可以利用Bootloader提供的一些命令接口來(lái)完成自己想要的操作
啟動(dòng)流程
大多數(shù)BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語(yǔ)言來(lái)實(shí)現(xiàn),而stage2則通常用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結(jié)構(gòu))
U-boot的stage1代碼通常放在start.s文件中,它用匯編語(yǔ)言寫成,其主要代碼部分如下:
(1) 定義入口。由于一個(gè)可執(zhí)行的image必須有一個(gè)
入口點(diǎn),并且只能有一個(gè)全局入口,通常這個(gè)入口放在rom(Flash)的0x0地址,因此,必須通知
編譯器以使其知道這個(gè)入口,該工作可通過(guò)修改連接器腳本來(lái)完成。
(2)設(shè)置異常向量(exception vector)。
(4)初始化內(nèi)存控制器 。
(5)將rom中的程序復(fù)制到ram中。
(7)轉(zhuǎn)到ram中執(zhí)行,該工作可使用指令ldrpc來(lái)完成。
2、 stage2(C語(yǔ)言代碼部分)
lib_arm/board.c中的start
armboot是C語(yǔ)言開(kāi)始的函數(shù),也是整個(gè)啟動(dòng)代碼中C語(yǔ)言的
主函數(shù),同時(shí)還是整個(gè)u-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作:
(1)調(diào)用一系列的初始化函數(shù)。
(2)初始化flash設(shè)備。
(3)初始化系統(tǒng)內(nèi)存分配函數(shù)。
(4)如果目標(biāo)系統(tǒng)擁有nand設(shè)備,則初始化nand設(shè)備。
(5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備。
(6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫ip,c地址等。
(7)進(jìn)入命令循環(huán)(即整個(gè)boot的工作循環(huán)),接受用戶從串口輸入的命令,然后進(jìn)行相應(yīng)的工作。