日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是Boot Loader

發(fā)布時間:2024/4/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是Boot Loader 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原創(chuàng)作品,允許轉載,轉載時請務必以超鏈接形式標明文章?原始出處?、作者信息和本聲明。否則將追究法律責任。http://yunli.blog.51cto.com/831344/181630

在嵌入式系統(tǒng)當中你可能經(jīng)常聽到 boot loader(引導加載器)這一詞,boot loader是指什么呢?在我們?nèi)粘=?jīng)常接觸的東西中是不是有與boot loader的作用或是概念相似的呢?有一點我一定猜得到,你現(xiàn)在正在用計算機看這篇文章。如果你稍微熟悉計算機的組成,你一定知道BIOS(Basic Input/Output System)。BIOS在計算機中就是用來啟動計算系統(tǒng)的,在完成一定的硬件初始化工作以及人機交互后,它加載位于硬盤中的操作系統(tǒng),并最終運行操作系統(tǒng)。嵌入式系統(tǒng)中的boot loader與BIOS的作用就是相類似的,也是完成對于處理器相關的硬件資源進行初始化后,最后加載通常是存放在FLASH中的應用程序,當然在嵌入式系統(tǒng)當中操作系統(tǒng)與應用程序一般是在同一個可執(zhí)行文件中的,這與我們的電腦有很大的不同。

BIOS與boot loader有相同之處,比如:
??? 1)完成處理器正常最小系統(tǒng)的初始化。最小系統(tǒng)的概念通過舉個例比較容易讓人明白,比如對于我們的計算機,通常在初始化時不需要用到以太網(wǎng),因此,在最小化系統(tǒng)中就不包括以太網(wǎng)卡的初始化,對其的初始化完全可以放到操作系統(tǒng)中去做,而不是在BIOS中。相類似的是,在嵌入式系統(tǒng)中,我們通常不需要在初始化的過程中用到USB設備,那么對于USB設備的初始化就不需要包含在最小系統(tǒng)中,而可以在被boot loader加載的應用程序中去初始化它。
??? 2)兩者在最后都得加載其它的程序,并將運行權交給被加載的程序。對于BIOS,其所加載的程序通常是操作系統(tǒng),當然,如果你正在安裝系統(tǒng)那么BIOS所加載的可能是位于光盤中安裝程序。對于loader,其加載的是一個可執(zhí)行程序,這一可執(zhí)行程序包括實時操作系統(tǒng)(有的也不是實時操作系統(tǒng))和我們的應用程序。
??? 3)如果BIOS或是boot loader程序太大,通常都會采用壓縮技術對其進行壓縮。對于BIOS,其肯定會采用壓縮技術進行壓縮,因為BIOS隨著計算機行業(yè)的飛速發(fā)展而越來越復雜,比如,以前的BIOS不需要支持USB的鼠標和鍵盤,但現(xiàn)在就得支持了,這就意味著BIOS要有USB鼠標和鍵盤的驅(qū)動程序。另一方面計算機的出貨量大,所以BIOS芯片(其實就是一塊FLASH芯片)的容量也就會盡可能的控制得小以提高利潤,比如可能控制其容量在512K字節(jié)。同BIOS相類似的是,如果我們的嵌入式系統(tǒng)中的FLASH緊張時,為了節(jié)省FLASH空間,我們也得對boot loader采用壓縮技術。可能有人要問,BIOS也好,boot loader也好,如果采用了壓縮技術對其壓縮,那是誰負責在運行它們時對其解壓縮呢?答案是它們自己,很有趣吧!其實,我們說對它們采用壓縮技術并不是對于全部的程序(或數(shù)據(jù))都采用壓縮技術。在它們當中,一定存在一部分不壓縮的部分,這保證處理器啟動時,能直接運行這部分的代碼。技巧在于,沒有壓縮的代碼當中包括了解壓程序(從C程序角度來看是幾個函數(shù)),其將被壓縮了的部分解壓到內(nèi)存中。當然,其中的程序處理很有技巧性,要保證程序在運行的過程中,對于壓縮部分代碼的運行是透明的,這在具體的代碼分析中我們再來看。

BIOS與boot loader除了相同之處外,還有不同之處,它們是:
??? 1)BIOS往往比boot loader復雜很多,因為我們的計算機硬件環(huán)境比嵌入式系統(tǒng)復雜得多。在計算機行業(yè),為了保證操作系統(tǒng)在設計時盡可能運行在不同的主板上,這需要BIOS的幫助以屏蔽一些硬件信息。操作系統(tǒng)對主板上的一些硬件資源的訪問,需要通過BIOS來完成,即調(diào)用BIOS的功能(或說是函數(shù))來完成。這樣做的好處是非常的明顯的,操作系統(tǒng)的開發(fā)商不用關心主板上的具體硬件是如何設計的,而主板的設計廠商則負責實現(xiàn)BIOS來對主板上的硬件資源進行存取訪問。總的來說,就是將主板上對于復雜硬件資源的處理任務交給了主板廠商來完成,而不用操作系統(tǒng)廠商去關心,因當說這樣做非常的合理和有效。
??? 2)BIOS在加載完了操作系統(tǒng)以后,其還將駐留在內(nèi)存中,以便操作系統(tǒng)在運行的過程中調(diào)用其功能,但boot loader就不需要這樣了。通常,boot loader加載完了程序后,跳轉到被加載的程序后就不再存在了,這里所說的跳轉有時也稱之為將運行權交給了被加載程序。
??? 3)boot loader通常采用匯編和C程序相結合進行編寫,但BIOS為了節(jié)省程序空間往往全部采用匯編進行編寫。

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

需要指出的是,在嵌入式系統(tǒng)中我們的應用程序當中還得做一部分與boot loader相同的工作。比如,對于中斷服務程序的重新初始化,因為在boot loader中設置的是boot loader中的程序作為中斷服務程序,當應用程序加載了以后,boot loader中的程序就不復存在了,因此,我們需要重新初始化中斷服務程序以指向被加載程序中的函數(shù)。對于SDRAM內(nèi)存的初始化、PLL的初始化,在應用程序中通常不需要重新做。

雖然,在此我們沒有對具體的處理器和操作系統(tǒng)進行講解,但是無論對于什么處理器和操作系統(tǒng),其總體過程幾乎相同,只是處理器的指令集不同。最后,我要給讀者您留一個問題,這個問題如下。

*************************************************************************************

我們說boot loader通常采用匯編和C語言相結合來編寫的,那能不能全部用C語言來進行編寫呢?為什么?


對于這一問題的答案是:不能。C程序中所有的代碼都是以函數(shù)的形式出現(xiàn)的。可能有人要說在C中也可以嵌入?yún)R編代碼,能不能用這種方式來實現(xiàn)整個boot loader呢?再看看題目,這里只考慮所有的代碼只能是以函數(shù)的形式出現(xiàn)。那C程序中函數(shù)調(diào)用要一個什么樣的環(huán)境呢?堆棧!我們寫C程序時在函數(shù)名的后面,就是用花括號將代碼括起來的,開始的花括號其實可以理解為有一段匯編代碼(具體細節(jié)以后會有文章進行解釋)對堆棧進行操作。那堆棧從哪來呢?顯然,堆棧是一塊內(nèi)存區(qū),也就是說我們用C程序?qū)懘a之前,必須保證內(nèi)存已經(jīng)初始化好了、可以用了。回憶一下,SDRAM內(nèi)存芯片的初始化是boot loader中很重要的一步。也就是說,我們必須保證初始化好了SDRAM內(nèi)存芯片后,才能進行C函數(shù)調(diào)用。因此,完全用C語言來實現(xiàn)boot loader是不可行的。



本文出自 “至簡李云” 博客,請務必保留此出處http://yunli.blog.51cto.com/831344/181630

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的什么是Boot Loader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。