對Bootloader(引導加載程序)的幾點理解


1、在加電復位之后,大多數處理器都會從一個默認的地址處獲取代碼。比如MIPS結構的CPU會從0xBFC00000處取第一條指令,而ARM結構的CPU則從地址0x00000000處取第一條指令。因此,在嵌入式開發板中,需要把存儲器件ROM或Flash等映射到這個默認的地址處,Bootloader就存放在這個地址開始處,這樣一上電就可以執行Bootloader。

2、當Bootloader完成基本的處理器和平台初始化之后,它的主要任務是獲取並引導一個完整的操作系統。它負責定位、載入以及將控制權移交給主操作系統。當操作系統獲得控制權之后,Bootloader就會被覆蓋,不復存在了

3、在正確地初始化DRAM控制器和DRAM本身之前,嵌入式系統能做的事情很少。Bootloader首先必須要做的工作之一就是啟用內存子系統。當內存初始化完成后,它就成為系統的可用資源。實際上,很多Bootloader在完成內存的初始化之后,所做的第一件事就是將它們自身復制到DRAM中,以加快執行速度。

4、在系統加電后,Bootloader獲得控制權時,不存在程序運行的基礎設施,Bootloader必須創造它自身的運行環境,並且在必要時將自身移動到RAM的合適位置。

5、當Bootloader獲得控制權時,並不存在上下文或執行環境。在Bootloader初始化處理器和相關硬件之前,系統中沒有任何DRAM可用。而在典型的C函數中,任何局部變量都保存在內存棧中。也就是說,在Bootloader初始化處理器和相關硬件之前,是不能調用C語言編寫的代碼的。那么,我們還可以推理出,Bootloader是不可能完全使用C代碼編寫的,其必須首先使用匯編代碼初始化一個合適C代碼運行的環境后才能跳轉到C代碼處執行。

6、在編譯和鏈接生成Bootloader時,開發人員必須控制鏡像的構造和鏈接。尤其是當Bootloader需要將其自身從閃存重新部署到RAM中時,更是如此。開發人員必須傳遞很多參數給編譯器和連接器,用於定義最終可執行鏡像的特征和布局。代碼的組織結構需要符合處理器的引導要求(最初的可執行指令必須放在閃存中的一個預定位置,這個位置取決於使用的處理器和硬件架構)。那么,開發人員如何指定一個二進制鏡像的內部結構呢?可以傳遞給連接器一個鏈接描述文件,也稱為連接器命令腳本。

7、硬件設計保證了處理器可以從閃存中正確獲取指令,並且保證了系統的時鍾頻率是某個默認值,除此之外,程序幾乎不能做任何假定。實際上,大多數處理器在啟動時都沒有可使用的DRAM來暫時存儲變量或是用作棧,然而,C程序的函數調用規范(calling convention)需要一個棧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM