对Bootloader(引导加载程序)的几点理解
1、在加電復位之后,大多數(shù)處理器都會從一個默認的地址處獲取代碼。比如MIPS結(jié)構(gòu)的CPU會從0xBFC00000處取第一條指令,而ARM結(jié)構(gòu)的CPU則從地址0x00000000處取第一條指令。因此,在嵌入式開發(fā)板中,需要把存儲器件ROM或Flash等映射到這個默認的地址處,Bootloader就存放在這個地址開始處,這樣一上電就可以執(zhí)行Bootloader。
2、當Bootloader完成基本的處理器和平臺初始化之后,它的主要任務(wù)是獲取并引導一個完整的操作系統(tǒng)。它負責定位、載入以及將控制權(quán)移交給主操作系統(tǒng)。當操作系統(tǒng)獲得控制權(quán)之后,Bootloader就會被覆蓋,不復存在了。
3、在正確地初始化DRAM控制器和DRAM本身之前,嵌入式系統(tǒng)能做的事情很少。Bootloader首先必須要做的工作之一就是啟用內(nèi)存子系統(tǒng)。當內(nèi)存初始化完成后,它就成為系統(tǒng)的可用資源。實際上,很多Bootloader在完成內(nèi)存的初始化之后,所做的第一件事就是將它們自身復制到DRAM中,以加快執(zhí)行速度。
4、在系統(tǒng)加電后,Bootloader獲得控制權(quán)時,不存在程序運行的基礎(chǔ)設(shè)施,Bootloader必須創(chuàng)造它自身的運行環(huán)境,并且在必要時將自身移動到RAM的合適位置。
5、當Bootloader獲得控制權(quán)時,并不存在上下文或執(zhí)行環(huán)境。在Bootloader初始化處理器和相關(guān)硬件之前,系統(tǒng)中沒有任何DRAM可用。而在典型的C函數(shù)中,任何局部變量都保存在內(nèi)存棧中。也就是說,在Bootloader初始化處理器和相關(guān)硬件之前,是不能調(diào)用C語言編寫的代碼的。那么,我們還可以推理出,Bootloader是不可能完全使用C代碼編寫的,其必須首先使用匯編代碼初始化一個合適C代碼運行的環(huán)境后才能跳轉(zhuǎn)到C代碼處執(zhí)行。
6、在編譯和鏈接生成Bootloader時,開發(fā)人員必須控制鏡像的構(gòu)造和鏈接。尤其是當Bootloader需要將其自身從閃存重新部署到RAM中時,更是如此。開發(fā)人員必須傳遞很多參數(shù)給編譯器和連接器,用于定義最終可執(zhí)行鏡像的特征和布局。代碼的組織結(jié)構(gòu)需要符合處理器的引導要求(最初的可執(zhí)行指令必須放在閃存中的一個預定位置,這個位置取決于使用的處理器和硬件架構(gòu))。那么,開發(fā)人員如何指定一個二進制鏡像的內(nèi)部結(jié)構(gòu)呢?可以傳遞給連接器一個鏈接描述文件,也稱為連接器命令腳本。
7、硬件設(shè)計保證了處理器可以從閃存中正確獲取指令,并且保證了系統(tǒng)的時鐘頻率是某個默認值,除此之外,程序幾乎不能做任何假定。實際上,大多數(shù)處理器在啟動時都沒有可使用的DRAM來暫時存儲變量或是用作棧,然而,C程序的函數(shù)調(diào)用規(guī)范(calling convention)需要一個棧。
轉(zhuǎn)載于:https://www.cnblogs.com/nufangrensheng/p/3659199.html
總結(jié)
以上是生活随笔為你收集整理的对Bootloader(引导加载程序)的几点理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery 获取checkbox的ch
- 下一篇: Google帮助IE浏览器实现对SVG支