2013-05-01 61 views
7

最近我開始學習嵌入式系統和嵌入式Linux。我知道在嵌入式系統中,操作系統存儲在Flash或ROM上。當它啓動時,引導加載程序會將操作系統加載到主內存中,並且使用Raspberry Pi,「flash或ROM」是SD卡。樹莓派的引導程序如何工作?

所以,我正在尋找樹莓派,因爲我想開始練習一個,我對「引導」樹莓派的概念感到困惑。我的問題是Raspberry Pi使用的bootloader是什麼,它的工作原理是什麼? (也就是說,內核之前會發生什麼過程?head.omain.c?(start kernel))

+0

這裏回答得很好:http://raspberrypi.stackexchange。com/a/10490/34554 – opyate 2015-09-09 12:15:54

+0

我投票結束這個問題作爲脫離主題,因爲它屬於http://raspberrypi.stackexchange.com,它是(http://raspberrypi.stackexchange.com/questions/10489 /如何-做樹莓-PI-引導) – 2015-12-01 12:42:27

回答

13

這個過程已經描述過了,你應該在網上找到它沒有問題。

樹莓派包含一個GPU和一個ARM處理器,兩個獨立的處理器。 GPU首先出現,我假定它是由一個片上ROM或者硬件讀取SD卡尋找第一個引導文件bootcode.bin來驅動的。就我們而言,GPU引導程序沒有記錄,它將芯片調到某一點,然後加載start.elf另一個GPU程序。該gpu程序完成啓動芯片(ddr init)並最終加載ARM應用程序kernel.img(不是arm bootloader,而是linux中的應用程序),它直接加載到ram中,並執行正常引導加載程序將執行的操作準備手臂啓動Linux(通常幾乎沒有),然後手臂啓動。

傳統的引導加載程序是當您只有一個處理器,並且該處理器也將運行應用程序/操作系統。像redboot和uboot這樣的名稱,但是這些已經變得非常複雜,操作系統本身。它只需要很少的啓動linux,把幾個ATAG放在內存中,並設置一些寄存器,就是這樣(當然你已經提出了系統/內存等,這不需要太多的代碼,但是是delecate /困難的例如代碼爲ddr),較新的Linux有更多的東西來設置,但不是太多。

樹莓派啓動簡單以及可移動非易失性存儲(SD卡)功能的優雅,它可以讓你回到預啓動加載程序的日子,在那裏你會彈出ROM並擦除它們它有一些這樣的痛苦,但是有一些方法。到現在爲止,可能存在第三方複雜(uboot等)引導程序。使用可移動閃存意味着你不需要一個強大的引導加載程序,你不必擔心在破壞應用程序的情況下刷新系統,只需簡單地刪除閃存並更改它即可恢復。引導加載程序已經從避免移除介質開始發展到避免在編程之後或在使用板上的套接字(socket)的情況下解開flash和resolder而註定要焊接的部分。

現在的kernel.img(一次加載到0x00000000)加載到0x8000。這就是所有你需要知道的,這是一個正常的核心圖像,你可以使用bootloader。然後,您可以編寫任何裸機或其他程序/應用程序,只要將地址0x8000作爲二進制文件的開頭和起始點鏈接即可。如果你想使用異常,你需要以某種方式編寫異常表(有各種方法可以做到這一點)。另一種方法是有一個傳統模式設置,您可以使用可選文件config.txt進行配置,並且會像rpi早期一樣將kernel.img加載到0x0000。我個人用現在默認的0x8000,其他裸機人走其他路徑...

我有一個非常簡單的xmodem引導程序和一個設置jtag引腳,所以你可以使用jtag(這兩種情況,以避免有當你開發你的應用程序時,做SD卡跳舞數百到數千次)。還有其他一些,更復雜一些的,甚至可能有一些網絡可以工作。