經(jīng)過了上一篇的配置,我們已經(jīng)執(zhí)行make就可以編譯出一個uboot.bin,但這還不夠,首先,此時的uboot并不符合三星芯片對bootloader的格式要求,同時,此時的uboot.bin也沒有結(jié)合我們的開發(fā)板進(jìn)行配置,還無法使用。而要進(jìn)行這樣的個性化配置,前提條件就是對uboot開機(jī)流程和編譯系統(tǒng)有所了解,本文主要討論前者。在三星的SoC中, 啟動流程可以分為三個階段BL0, BL1, BL2, BL3, 三星自己的手冊對BL1的解釋也不盡相同, 一種是將在iRAM中運(yùn)行的程序都?xì)w結(jié)為BL1; 一種是將iRAM中三星加密的代碼bl1.bin作為BL1, iRAM中剩余的部分作為BL2, 本文采用后者, 他們的主要分工如下:
BL0: ARM的起始地址都是0地址, 三星的芯片一般將0地址映射到iROM中, BL0就是指iROM中固化的啟動代碼, 主要負(fù)責(zé)加載BL1
BL1: 三星對于bootloader的加密代碼bl1.bin, 要放在外設(shè)中uboot.bin的頭上, 和一部分uboot.bin一起加載到iRAM中運(yùn)行.
BL2: 從(nand/sd/usb)中拷貝的uboot.bin頭最大14K到iRAM中代碼中除去bl1.bin后剩余的部分, 負(fù)責(zé)設(shè)置CPU為SVC模式, 關(guān)閉MMU, 關(guān)閉中斷, 關(guān)閉iCache, 關(guān)閉看門狗, 初始化DRAM,初始化時鐘, 初始化串口, 設(shè)置棧, 校驗(yàn)BL2并將其搬移到DRAM高位地址, 重定位到DRAM中執(zhí)行BL3
BL3:是指在代碼重定向后在內(nèi)存中執(zhí)行的uboot的完整代碼, 負(fù)責(zé)初始化外設(shè),更新向量表, 清BSS, 準(zhǔn)備內(nèi)核啟動參數(shù), 加載并運(yùn)行OS內(nèi)核
可以借助下圖理解這個流程
我們常說的uboot是一個兩階段bootloader,就是指上述的BL2和BL3. BL2主要做硬件直接相關(guān)的初始化,使用匯編編寫;BL3主要為操作系統(tǒng)的運(yùn)行準(zhǔn)備環(huán)境,主要用C編寫,這里以ARM平臺為例分析其啟動流程。下面是啟動過程中主要涉及的文件
網(wǎng)友評論