關於Bootloader的作用,老師教我們把它當作PC的BIOS來理解,但其實不完全是這么回事。文章參考:
http://www.cnblogs.com/yashi88/archive/2010/02/11/1667548.html
http://hi.baidu.com/shaohua312/item/2284a71e318c1512e3f98636
BootLoader 是系統加電后運行的第一段代碼。一般它只在系統啟動時非常短的時間內運行。
在PC中,整個BootLoader由BIOS(主板上固化的一段程序)、位於硬盤MBR區的OS Loader一起組成。BIOS完成第一級引導加載工作,OS Loader完成第二級引導加載工作(可能有些系統不只兩級加載)。上電后,系統開始執行BIOS中的代碼,這段代碼負責進行硬件檢測和資源分配,完成這步工作后,將按照CMOS中設定的順序檢索硬盤。BIOS將第一個檢索到的硬盤上MBR中的內容讀到系統RAM中,然后將系統控制權交給相應的OS Loader。最后由OS Loader負責將所要引導的操作系統的內核映象從硬盤上讀到系統RAM中,然后跳轉到內核的入口點上。
而在嵌入式中,通常不存在BIOS那樣的一段固定內容的固化的程序。原因是PC平台盡管品牌等有差異,但通常都有相近甚至是相同的體系結構,遵循一個共同的工業標准,因而可以使用同一個BIOS代碼來引導。而通常對嵌入式系統來說,即使是使用相同的架構,甚至是同一個CPU來構建,但因為並不能遵循的一個共同的工業標准。因而在嵌入式系統上除非兩者的各方面與引導過程相關設計完成一致,否則不能使用同一個BootLoader。
其實Bootloader主要的必須的作用只有一個:就是把操作系統映像文件拷貝到RAM中去,然后跳轉到它的入口處去執行,我們稱之為啟動加載模式,該過程沒有用戶的介入,是它正常工作的模式。它的步驟如下:
Stage1:
1. 硬件設備初始化。為stage2的執行及隨后內核的執行准備好基本的硬件環境
2. 為加載stage2 准備ram空間。為了獲得更好的執行速度,通常吧stage2加載到ram中執行
3. 復制stage2的代碼到ram中
4. 設置好堆棧
5. 跳轉到stage2的c程序入口
Stage2:
1. 初始化本階段要使用的硬件設備
2. 檢測系統內存映射
3. 將內核映像和根文件系統映像從flash讀到ram中
4. 為內核設置啟動參數
5. 調用內核
然而,在嵌入式開發中,經常需要為一個嵌入式的硬件系統下載新的Bootloader,操作系統(內核,根文件系統系統)等,此時用到的是Bootloader的下載功能,我們稱之為下載模式,該過程有用戶的介入。我在使用uboot的過程中,發現它提供了基於usb的下載(pc端的dnf),也有基於網絡的下載(我的開發板uboot啟動的時候開發板就已經有局域網的ip地址了,網卡已經被驅動了,uboot提供了基於tftp協議的下載,還有其它查看內存,格式化存儲器等功能)。
關於串口終端顯示的信息是不是由Bootloader提供的,我搜索了一下,沒找到相關信息。但我個人認為串口終端的信息也是Bootloader提供的,用於與用戶交互。
所以說,Bootloader並不是可以完全簡單的理解為pc的BIOS。它完成了BIOS+OSLoader的功能,同時向開發人員提供系統運行的信息及調試信息,提供了下載功能,及其它輔助功能。
下面這段純粹copy過來的
bootloader是不是必須的:
Bootloader並不是必須的,如果我們的硬件有足夠大的norflash,並且實現了XIP技術,那么WinCE 操作系統可以直接在norflash里面運行起來,不需要將它復制到RAM中去,所以Bootloader就失去了作用。
但是考慮到成本因素,現在的硬件一般都不會配置這么大的norflash,image文件都存儲在nand flash里面,所以都會用到Bootloader。
附加說明一下PC上Linux的啟動過程:
1.BIOS啟動,初始化硬件,系統自檢,假設BIOS設定為從硬盤啟動(這里不考慮光盤,及其它可移動存儲設備)
2.每個磁盤的首部都有一個MBR,記錄了分區信息,還有引導程序,新的硬盤沒有MBR,格式化之后就有了。系統找到硬盤的MBR,根據MBR里面的引導程序找到要啟動的分區。附圖一張,我常用的引導備份工具,:
3.根據MBR里面的引導程序,找到要啟動的分區,每個分區首部都要一個PBR,PBR里邊可能也有啟動信息,根據MBR里邊的程序來定。附兩張圖:
4.在指定的分區中加載Linux內核,啟動操作系統。
附件:
U-Boot的常用命令詳解.pdf
下載地址:
http://pan.baidu.com/share/link?shareid=135850&uk=3238766853