嵌入式Linux開發(fā)環(huán)境的搭建之:U-Boot移植
5.2U-Boot移植
5.2.1Bootloader介紹
1.概念
簡單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,它類似于PC機(jī)中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。
通常,Bootloader比較依賴于硬件平臺(tái),特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個(gè)通用的Bootloader是一件比較困難的事情。盡管如此,仍然可以對Bootloader歸納出一些通用的概念來指導(dǎo)面向用戶定制的Bootloader設(shè)計(jì)與實(shí)現(xiàn)。
(1)Bootloader所支持的CPU和嵌入式開發(fā)板。
每種不同的CPU體系結(jié)構(gòu)都有不同的Bootloader。有些Bootloader也支持多種體系結(jié)構(gòu)的CPU,如后面要介紹的U-Boot支持ARM、MIPS、PowerPC等眾多體系結(jié)構(gòu)。除了依賴于CPU的體系結(jié)構(gòu)外,Bootloader實(shí)際上也依賴于具體的嵌入式板級設(shè)備的配置。
(2)Bootloader的存儲(chǔ)位置。
系統(tǒng)加電或復(fù)位后,所有的CPU通常都從某個(gè)由CPU制造商預(yù)先安排的地址上取指令。而基于CPU構(gòu)建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲(chǔ)設(shè)備(比如ROM、EEPROM或Flash等)被映射到這個(gè)預(yù)先安排的地址上。因此在系統(tǒng)加電后,CPU將首先執(zhí)行Bootloader程序。
(3)Bootloader的啟動(dòng)過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。
(4)Bootloader的操作模式。大多數(shù)Bootloader都包含兩種不同的操作模式:“啟動(dòng)加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。
n 啟動(dòng)加載模式:這種模式也稱為“自主”模式。也就是Bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過程并沒有用戶的介入。這種模式是嵌入式產(chǎn)品發(fā)布時(shí)的通用模式。
n 下載模式:在這種模式下,目標(biāo)機(jī)上的Bootloader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被Bootloader保存到目標(biāo)機(jī)的RAM中,然后再被Bootloader寫入到目標(biāo)機(jī)上的Flash類固態(tài)存儲(chǔ)設(shè)備中。Bootloader的這種模式在系統(tǒng)更新時(shí)使用。工作于這種模式下的Bootloader通常都會(huì)向它的終端用戶提供一個(gè)簡單的命令行接口。
(5)Bootloader與主機(jī)之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議,最常見的情況就是,目標(biāo)機(jī)上的Bootloader通過串口與主機(jī)之間進(jìn)行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜?,因此通過以太網(wǎng)連接并借助TFTP等協(xié)議來下載文件是個(gè)更好的選擇。
2.Bootloader啟動(dòng)流程
Bootloader的啟動(dòng)流程一般分為兩個(gè)階段:stage1和stage2,下面分別對這兩個(gè)階段進(jìn)行講解。
(1)Bootloader的stage1。
在stage1中Bootloader主要完成以下工作。
n 基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPU的速度和時(shí)鐘頻率、RAM初始化、初始化外圍設(shè)備、關(guān)閉CPU內(nèi)部指令和數(shù)據(jù)cache等。
n 為加載stage2準(zhǔn)備RAM空間,通常為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準(zhǔn)備好一段可用的RAM空間。
n 復(fù)制stage2到RAM中,在這里要確定兩點(diǎn):①stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;②RAM空間的起始地址。
n 設(shè)置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準(zhǔn)備。
(2)Bootloader的stage2。
在stage2中Bootloader主要完成以下工作。
n 用匯編語言跳轉(zhuǎn)到main入口函數(shù)。
由于stage2的代碼通常用C語言來實(shí)現(xiàn),目的是實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時(shí),不能使用glibc庫中的任何支持函數(shù)。
n 初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前可以輸出一些打印信息。
n 檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。
n 加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上復(fù)制數(shù)據(jù)。
n 設(shè)置內(nèi)核的啟動(dòng)參數(shù)。
5.2.2U-Boot概述
1.U-Boot簡介
U-Boot(UniversalBootloader)是遵循GPL條款的開放源碼項(xiàng)目。它是從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。但是U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),而且還支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系統(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。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前為止,U-Boot對PowerPC系列處理器支持最為豐富,對Linux的支持最完善。
2.U-Boot特點(diǎn)
U-Boot的特點(diǎn)如下。
n 開放源碼;
n 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;
n 支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
n 較高的可靠性和穩(wěn)定性;
n 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求和產(chǎn)品發(fā)布等;
n 豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、Flash、LCD、NVRAM、EEPROM、RTC、鍵盤等;
n 較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持。
3.U-Boot主要功能
U-Boot可支持的主要功能列表。
n 系統(tǒng)引導(dǎo):支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)。支持NFS掛載,并從Flash中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核。
n 基本輔助功能:強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(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映像文件是否完好。
n 設(shè)備驅(qū)動(dòng):串口、SDRAM、Flash、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動(dòng)支持。
n 上電自檢功能:SDRAM、Flash大小自動(dòng)檢測;SDRAM故障檢測;CPU型號。
n 特殊功能:XIP內(nèi)核引導(dǎo)。
5.2.3U-Boot源碼導(dǎo)讀
1.U-Boot源碼結(jié)構(gòu)
U-Boot源碼結(jié)構(gòu)如圖5.27所示。
圖5.27U-Boot源碼結(jié)構(gòu)
n board:和一些已有開發(fā)板有關(guān)的代碼,比如makefile和U-Boot.lds等都和具體開發(fā)板的硬件和地址分配有關(guān)。
n common:與體系結(jié)構(gòu)無關(guān)的代碼,用來實(shí)現(xiàn)各種命令的C程序。
n cpu:包含CPU相關(guān)代碼,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個(gè)特定的子目錄中都包括cpu.c和interrupt.c,start.S等。其中cpu.c初始化CPU、設(shè)置指令Cache和數(shù)據(jù)Cache等;interrupt.c設(shè)置系統(tǒng)的各種中斷和異常,比如快速中斷、開關(guān)中斷、時(shí)鐘中斷、軟件中斷、預(yù)取中止和未定義指令等;匯編代碼文件start.S是U-BOOT啟動(dòng)時(shí)執(zhí)行的第一個(gè)文件,它主要是設(shè)置系統(tǒng)堆棧和工作方式,為進(jìn)入C程序奠定基礎(chǔ)。
n disk:disk驅(qū)動(dòng)的分區(qū)相關(guān)代碼。
n doc:文檔。
n drivers:通用設(shè)備驅(qū)動(dòng)程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。
n fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs等。
n include:頭文件,還有對各種硬件平臺(tái)支持的匯編文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。
n net:與網(wǎng)絡(luò)有關(guān)的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實(shí)現(xiàn)。
n lib_arm:與ARM體系結(jié)構(gòu)相關(guān)的代碼。
n tools:創(chuàng)建S-Record格式文件和U-BOOTimages的工具。
c語言相關(guān)文章:c語言教程
linux相關(guān)文章:linux教程
評論