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