BootLoader的基本概念(頁 1) - 嵌入式係統論壇 - 自動化論壇 Autooo.net - Autooo.Net

2008-5-5 10:11 xwmlz
BootLoader的基本概念

BootLoader的基本概念  
   
板級支持包(BSP)

BSP是板級支持包(Board Support Package)的縮寫,是通常用在嵌入行業中的一個術語,用來代表在一個特殊硬件平台上快速構建一個嵌入操作係統所需的原始資料或者二進製軟件包。BSP的作用是支持操作係統,使之能夠更好的運行於硬件平台。BSP是相對於操作係統而言的,不同的操作係統對應於不同定義形式的BSP,包括Windows CE、Linux、Vxworks等。SoC/CPU廠商應向其芯片的用戶提供一個基本的BSP包,以支持主板廠商或整機製造廠商在此基礎上定製和開發各種商用終端產品。

  

在嵌入式係統學習過程中設計到了Bootloader,下麵講述了Bootloader的基本作用,在後續的文章中我將對如何編寫自己的Bootloader進行介紹。

1. Bootloader的基本概念:

簡單地說,bootloader就是在操作係統內核運行前運行地一段小程序。通過這段小程序,可以對硬件設備,如CPU、SDRAM、Flash、串口等進行初始化,也可以下載文件到係統板、對Flash進行擦除和編程,真正起到引導和加載內核鏡像的作用,但是隨著嵌入式係統的發展,bootloader已經逐漸在基本功能的基礎上,進行了擴展,bootloader可以更多地增加對具體係統的板級支持,即增加一些硬件模塊功能上的使用支持,以方便開發人員進行開發和調試。從這個層麵上看,功能擴展後bootloader可以虛擬地看成是一個微小的係統級的代碼包。

bootloader是依賴於硬件而實現的,特別是在嵌入式係統中。不同的體係結構需求的bootloader是不同的;除了體係結構,bootloader還依賴於具體的嵌入式板級設備的配置。也就是說,對於兩塊不同的嵌入式板而言,即使它們基於相同的CPU構建,運行在其中一塊電路板上的bootloader,未必能夠運行在另一塊電路開發板上。

BootLoader最為係統複位或上電後首先運行的代碼,一般應寫在起始物理地址0x0開始。Bootloader的啟動過程可以是單階段的,也可以是多階段的。通常多階段的bootloader能提供更為複雜的功能,以及更好的可移植性。從固態存儲設備上啟動的bootloader大多數是二階段的啟動過程,也即啟動過程可以分為stage 1和stage 2兩部分。

2. ARM Bootloader的一般作用

對於一個ARM係統來說,本質上,bootloader作為引導與加載內核鏡像的“工具”,在實現上,必須提供以下幾個功能,更確切地說,必須做到以下幾點:

(1) 初始化RAM(必需):bootloader必須能夠初始化RAM,因為將來係統要通過它保存一些Volatile數據,但具體地實現要依賴與具體的CPU以及硬件係統。

(2) 初始化串口(可選,推薦):bootloader應該要初始化以及使能至少一個串口,通過它與控製台聯係進行一些debug的工作;甚至與PC通信。

(3  n啟動內核鏡像(必需):根據內核鏡像保存的存儲介質不同,可以有兩種啟動方式:FALSH啟動以及RAM啟動;但是無論是哪種啟動方式,下麵的係統狀態必須得到滿足:

l     CPU寄存器的設置:     R0=0;

      R1=機器類型;

      R2=啟動參數標記列表在RAM中的起始地址;

      這三個寄存器的設置是在最後啟動內核時通過啟動參數來傳遞完成的。

l     CPU模式:     關閉中斷;

屬於SVC模式;

Bootloader中沒有必要支持中斷的實現,這屬於內核機製以及設備驅動管理的管理範疇;SVC模式是係統的一種保護模式,這樣就可以進行一些隻能在SVC模式下的操作,例如一些特定寄存器訪問操作。

l    Cache和MMU的設置:       MMU必須關閉;

數據cache必須關閉;

指令cache可以關閉也可以開啟;

Bootloader中所有對地址的操作都是使用物理地址,是實在的實地址,不存在虛擬地址,因此MMU必須關閉。Bootloader主要是裝載內核鏡像,鏡像數據必須真實寫回SDRAM中,所以數據cache必須關閉;而對於指令cache,不存在強製性的規定,但是一般情況下,推薦關閉指令cache。

   Bootloader啟動內核鏡像的方法是通過跳轉語句直接跳轉至內核鏡像的第一句指令語句。



Bootloader存在的必要性

Bootloader的功能決定了在引導Linux係統時,必須使用bootloader,除非你對linux內核進行了修改。

  Bootloader有兩個主要功能:

  1.在發布模式,自動引導linux係統,為係統初始化各種參數。

  2.在調試模式,要能夠方便的下載內核,引導內核。

  Linux係統一定要bootloader支持嗎?

  答:是的。通用的Linux內核,啟動時需要很多參數,這些參數必須通過bootloader傳遞。而且內核一般是壓縮存放到外存上的,從外存到內存的拷貝也是由bootloader完成。

  Bootloader為什麼不和kernel放到一起呢?

  答:不可以這樣做。從bootloader的第二個功能就知道,bootloader是不能和內核放到一起。當然,在發布模式時,是可以集成到一起的,通常沒必要。

  從哪裏可以得到bootloader?

  答:目前通用的bootloader很多,不論是嵌入式還是桌麵係統,比如lilo,grub,blob等。桌麵用的bootloader我們就不討論了,重點說一下嵌入式領域用的bootloader。采用通用的bootloader功能強大,開發容易,而且由專人維護升級,不過多是針對特定的CPU或者特定開發板的。如果是學習,推薦自己開發bootloader。

  如何編寫自己的bootloader?

  答:編寫一個bootloader隻要能夠完成前麵提到的兩個功能就可以了。分別描述一下這兩個功能的實現:

  1.該功能比較簡單,就是從FLASH中拷貝數據到RAM。如果內核的存放不是基於文件係統的,直接采用彙編就可以完成塊拷貝。然而如果內核存放在文件係統之上,比如內核存放到了基於ext2文件係統的CF卡上。首先我們的bootloader要能夠訪問CF卡,然後要能夠識別文件係統,隻有這樣才能正確找到內核文件並拷貝到內存中。

  2.該功能一般通過串口實現。對於ARM來說,驅動串口比較容易,直接從主機的串口接收內核數據存放到RAM中,就可以啟動內核了。如果需要發布,還要實現把內核從RAM燒寫到外存的能力。

  為了提高速度,充分挖掘開發板和CPU的潛力,出現了許多用網口和USB接口下載內核的bootloader。使用網口,bootloader必須提供網卡驅動和TCP/IP協議的支持。使用USB接口,需要提高大容量存儲類驅動。

  為了拓展思路,你也可以使用紅外,存儲卡接口進行數據下載。使用紅外接口,和串口基本一樣,無非就是沒有了連線。使用存儲卡,通常需要文件係統的支持。比如,我們使用SD卡存放內核,在主機交叉編譯好內核後,把內核存放到SD卡上。然後將XD卡插到目標板的插槽中,bootloader必須有能力把SD卡上的內核拷貝的RAM中,過程參考功能1的實現。


更多嵌入式相關資訊和技術文章,請登陸[url]www.re-er.com.cn[/url]

頁: [1]
查看完整版本: BootLoader的基本概念

Google


Autooo.Net
Copyright © 2007 All rights reserved