601B - Boot Loader

 

在嵌入式系統當中你可能常常聽到 boot loader(引導加載器)這一詞,boot loader是指什麼呢?在咱們平常常常接觸的東西中是否是有與boot loader的做用或是概念類似的呢?有一點我必定猜獲得,你如今正在用計算機看這篇文章。若是你稍微熟悉計算機的組成,你必定知道BIOS(Basic Input/Output System)。BIOS在計算機中就是用來啓動計算系統的,在完成必定的硬件初始化工做以及人機交互後,它加載位於硬盤中的操做系統,並最終運行操做系統。嵌入式系統中的boot loader與BIOS的做用就是相相似的,也是完成對於處理器相關的硬件資源進行初始化後,最後加載一般是存放在FLASH中的應用程序,固然在嵌入式系統當中操做系統與應用程序通常是在同一個可執行文件中的,這與咱們的電腦有很大的不一樣。

BIOS與boot loader有相同之處,好比:
    1)完成處理器正常最小系統的初始化。最小系統的概念經過舉個例比較容易讓人明白,好比對於咱們的計算機,一般在初始化時不須要用到以太網,所以,在最小化系統中就不包括以太網卡的初始化,對其的初始化徹底能夠放到操做系統中去作,而不是在BIOS中。相相似的是,在嵌入式系統中,咱們一般不須要在初始化的過程當中用到USB設備,那麼對於USB設備的初始化就不須要包含在最小系統中,而能夠在被boot loader加載的應用程序中去初始化它。
    2)二者在最後都得加載其它的程序,並將運行權交給被加載的程序。對於BIOS,其所加載的程序一般是操做系統,固然,若是你正在安裝系統那麼BIOS所加載的多是位於光盤中安裝程序。對於loader,其加載的是一個可執行程序,這一可執行程序包括實時操做系統(有的也不是實時操做系統)和咱們的應用程序。
    3)若是BIOS或是boot loader程序太大,一般都會採用壓縮技術對其進行壓縮。對於BIOS,其確定會採用壓縮技術進行壓縮,由於BIOS隨着計算機行業的飛速發展而愈來愈複雜,好比,之前的BIOS不須要支持USB的鼠標和鍵盤,但如今就得支持了,這就意味着BIOS要有USB鼠標和鍵盤的驅動程序。另外一方面計算機的出貨量大,因此BIOS芯片(其實就是一塊FLASH芯片)的容量也就會盡量的控制得小以提升利潤,好比可能控制其容量在512K字節。同BIOS相相似的是,若是咱們的嵌入式系統中的FLASH緊張時,爲了節省FLASH空間,咱們也得對boot loader採用壓縮技術。可能有人要問,BIOS也好,boot loader也好,若是採用了壓縮技術對其壓縮,那是誰負責在運行它們時對其解壓縮呢?答案是它們本身,頗有趣吧!其實,咱們說對它們採用壓縮技術並非對於所有的程序(或數據)都採用壓縮技術。在它們當中,必定存在一部分不壓縮的部分,這保證處理器啓動時,能直接運行這部分的代碼。技巧在於,沒有壓縮的代碼當中包括瞭解壓程序(從C程序角度來看是幾個函數),其將被壓縮了的部分解壓到內存中。固然,其中的程序處理頗有技巧性,要保證程序在運行的過程當中,對於壓縮部分代碼的運行是透明的,這在具體的代碼分析中咱們再來看。

BIOS與boot loader除了相同之處外,還有不一樣之處,它們是:
    1)BIOS每每比boot loader複雜不少,由於咱們的計算機硬件環境比嵌入式系統複雜得多。在計算機行業,爲了保證操做系統在設計時儘量運行在不一樣的主板上,這須要BIOS的幫助以屏蔽一些硬件信息。操做系統對主板上的一些硬件資源的訪問,須要經過BIOS來完成,即調用BIOS的功能(或說是函數)來完成。這樣作的好處是很是的明顯的,操做系統的開發商不用關心主板上的具體硬件是如何設計的,而主板的設計廠商則負責實現BIOS來對主板上的硬件資源進行存取訪問。總的來講,就是將主板上對於複雜硬件資源的處理任務交給了主板廠商來完成,而不用操做系統廠商去關心,因當說這樣作很是的合理和有效。
    2)BIOS在加載完了操做系統之後,其還將駐留在內存中,以便操做系統在運行的過程當中調用其功能,但boot loader就不須要這樣了。一般,boot loader加載完了程序後,跳轉到被加載的程序後就再也不存在了,這裏所說的跳轉有時也稱之爲將運行權交給了被加載程序。
    3)boot loader一般採用彙編和C程序相結合進行編寫,但BIOS爲了節省程序空間每每所有采用匯編進行編寫。

下面咱們來看一看boot loader在啓動過程當中會作哪些事情。在討論這些以前,咱們須要明白嵌入式系統的處理器與咱們計算機處理器的區別是什麼。對於嵌入式系統的處理器,準確的說應當叫微控制器,即英文的microcontroller,而咱們的計算機處理器則應稱之爲微處理器,即microprocessor。微控制器除了具備微處理器的功能外(即經過運算來處理必定的事務),每每其中集成了不少的其它硬件功能模塊,好比SDRAM內存控制器、I2C控制器、SD卡控制器等等。正如微處理器的名字那樣,它只有處理功能,其它的控制芯片都是經過芯片組(什麼是芯片組,我打算後面用另外一篇文章來進行解釋)來完成的。雖然,咱們對於微處理器和微控制器採用了處理器這麼一個簡化詞來描述,但咱們須要明白其中的不一樣之處,這一點很是的重要。下面咱們來看一看boot loader作些什麼事情,它們有:
    1)對PLL時鐘進行初始化。每每處理器一啓動時,爲了更好的設備兼容性,其工做頻率都很低,在boot loader程序的特定位置,須要提升處理器的時鐘頻率,以加快運行速度。速度一旦調好每每是不會改變的了,之因此說是每每,由於若是處理器支持節電模式功能,那也會形成PLL時鐘的變化(時鐘越快越耗電)。
    2)初始化SDRAM內存控制器。一般loader自身也須要用到內存,好比,大多boot loader都會將本身加載到內存中。內存的配置通常是包括行地址和列地址的配置以及自動刷新頻率的配置。一旦配置好了,後面就不用再更改了。
    3)初始化中斷控制器和中斷服務程序。
    4)初始化各地址空間的片選地址寄存器和讀寫時序。
    5)初始化堆棧(stack)寄存器。好比,在x86中須要初始化ESP寄存器,在PowerPC中須要初始化r1寄存器。
    6)對於boot loader中須要訪問的其它硬件設備進行初始化。好比,咱們一般會有一個串口做爲控制檯(console),這就須要在boot loader中初始化相應的串口,並接受用戶的命令,以響應用戶的請求。能夠想像,boot loader中存在必定的命令處理程序。
    7)將boot loader自身加載到內存中,若是須要解壓,那麼還得作解壓操做。前面提到了,將boot loader加載到內存是爲了更快的運行程序。
    8)加載須要運行的應用程序並最終運行被加載的應用程序。

須要指出的是,在嵌入式系統中咱們的應用程序當中還得作一部分與boot loader相同的工做。好比,對於中斷服務程序的從新初始化,由於在boot loader中設置的是boot loader中的程序做爲中斷服務程序,當應用程序加載了之後,boot loader中的程序就不復存在了,所以,咱們須要從新初始化中斷服務程序以指向被加載程序中的函數。對於SDRAM內存的初始化、PLL的初始化,在應用程序中一般不須要從新作。

雖然,在此咱們沒有對具體的處理器和操做系統進行講解,可是不管對於什麼處理器和操做系統,其整體過程幾乎相同,只是處理器的指令集不一樣。最後,我要給讀者您留一個問題,這個問題以下。
web

    咱們說boot loader一般採用彙編和C語言相結合來編寫的,那能不能所有用C語言來進行編寫呢?爲何?

    
請將你的答案回覆在後面,個人答案將在後面的一篇文章中給出(請參見《
boot loader能所有用C程序編寫嗎》)。ide

    若是你以爲本文的哪些地方須要改進或是存在一些不明白的地方,請留言。若是你想參與討論嵌入式系統開發相關的話題,請加入技術圈(g.51cto.com/UltraEmbedded)。

 

本文出自 「李雲」 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/181630函數

相關文章
相關標籤/搜索