天天看點

BSP Bootloader基本概念

闆級支援包(BSP)

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

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)啟動核心鏡像(必需):根據核心鏡像儲存的存儲媒體不同,可以有兩種啟動方式: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啟動核心鏡像的方法是通過跳轉語句直接跳轉至核心鏡像的第一句指令語句。 

3. Bootloader存在的必要性

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

  Bootloader有兩個主要功能:

  1.在釋出模式,自動引導linux系統,為系統初始化各種參數。

2.在調試模式,要能夠友善的下載下傳核心,引導核心。

4. Bootloader相關問題

  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卡上。然後将SD卡插到目标闆的插槽中,bootloader必須有能力把SD卡上的核心拷貝的RAM中,過程參考功能1的實作。

UBOOT , NBOOT EBOOT 三者有什麼差別?

1.        nboot是samsung系列cpu為了能将前4KB程式複制到SRAM中運作,而在wince寫的。

2.        eboot其實應該是Ethernet Boot,因為起始時,都是通過網口更新的。當然現在大部分反而通過USB了。

3.        uboot是linux下主要使用的,不過現在已經剝離開來,ce下已經可以移植了,隻是用來debug的多,實際合入工程的少,畢竟與wince系統的契合度不高。

繼續閱讀