Beaglebone bootloader雜談

    既然是雜談,內容就比較輕鬆一點。這裏沒有教你們怎樣一步步去針對新的硬件平臺去修改U-Boot代碼(說真的,要想學這些仍是去看U-Boot的文檔比較靠譜),在這我只是泛泛的侃侃Bootloader和怎樣生成針對Beaglebone的bootloader,嗯,閒話少敘,這就開始。操作系統

先說說Beaglebone的boot過程
    大部分處理器的BOOT過程都要經歷多個階段,所謂的「chained loading method」,每一步新的bootloader都完成一些CPU初始化工做,加載下一步要運行的程序,而後將CPU的控制權徹底轉交。
    對於Beaglebone平臺來講,其使用的是AM335x系列的CPU,系統boot過程分爲四大步:
    1)處理器PoR(power-on reset)後就會跳到復位向量所指的程序段去運行,這段程序位於處理器的ROM中,由處理器生產廠商提供,咱們稱其爲ROM Boot Loader(RBL)。RBL在初始化固定存儲設備(NAND Flash,MMC,Etc.)後,根據CPU的跳線選擇,從持久性存儲設備中將第二部要用到的bootloader讀入內存(至因而內部仍是外部,要根據ROM中的程序來定,Beaglebone是內部ram),然後將控制權轉交。
     2)這一步的bootloader咱們稱爲Secondary Program Loader(SPL),固然這是TI的叫法,你也能夠稱其爲xloader,UBL。SPL完成有限的初始化工做,最重要的就是初始化DDR RAM(或是其餘大一點的外部RAM),由於下一步的U-Boot將要進駐其中。在這以後,SPL從持久性存儲設備中將U-Boot(其餘bootloader也行,咱們這裏以U-Boot爲例)讀入DDR RAM中,隨後轉交CPU控制權。
    3)終於到了萬衆矚目的U-Boot階段,使能大部分的處理器功能,將操做系統內核讀入DDR RAM中,然後配置啓動參數啓動Linux內核。固然U-Boot的功能可不止這些,U-Boot中提供了不少應用程序,可使用tftp下載文件,或是格式化存儲設備等等。
    4)Linux內核啓動……內核初始化,MMU使能,外部設備初始化,PID(1)Init進程啓動……
WHY 4 STEPS?
    好了,那可能有人會問,搞得那麼麻煩幹嗎?一步Boot起來不行嗎?>_< 其實任何一門技術都是讓咱們的生活變的簡單,Bootloader也是,因此其不多是麻煩……首先,第一步的RBL不可能太複雜,ROM大小是一個限制,最重要的仍是由於其所能獲取的系統信息太少,因此處理器只能使用簡單的方法去尋找能完成複雜功能的代碼,然後將處理器初始化工做交給它來完成。其次,SPL也不能很複雜,由於其位於處理器的內部RAM中,通常處理器的內部RAM都要小於128KB,其大小注定其不能完成很複雜的功能,是故,再尋找能力更強大一些的代碼,將處理器初始化工做交給它來完成。到了在DDR RAM中執行的Bootloader(U-Boot算一個),其功能就比較完善了,此時就能夠啓動操做系統了。
    最後上兩張圖:.net


圖1 Beaglebone boot圖解

image
圖2 硬件跳線提示RBL從何處讀取SPL進程

下面就該說說U-BOOT了內存

    U-Boot全名是DAS U-Boot,一看就是德國佬作的,DAS嗎…… 背景就很少介紹了,你們本身Google吧。
    處理器在BOOT的前三個階段都是不適用MMU的,也就是說在此三個階段運行的程序,都是直接訪問處理器的物理地址,只有到操做系統進行MMU初始化後,虛擬地址地址系統纔算啓動。爲何說這個?若是你們寫了裸機程序想使用U-Boot加載運行,別忘了在編譯的時候指明要加載的硬件地址!
    U-Boot 主要完成的功能有:
    1)初始化處理器時鐘,設置pin mux。
    2)讀取內核鏡像。
    3)使用用戶指定的內核啓動參數啓動內核。

今天先到這裏,有點不舒服…… 文檔

相關文章
相關標籤/搜索