經(jīng)過了上一篇的配置,我們已經(jīng)執(zhí)行make就可以編譯出一個uboot.bin,但這還不夠,首先,此時的uboot并不符合三星芯片對bootloader的格式要求,同時,此時的uboot.bin也沒有結(jié)合我們的開發(fā)板進行配置,還無法使用。而要進行這樣的個性化配置,前提條件就是對uboot開機流程和編譯系統(tǒng)有所了解,本文主要討論前者。在三星的SoC中, 啟動流程可以分為三個階段BL0, BL1, BL2, BL3, 三星自己的手冊對BL1的解釋也不盡相同, 一種是將在iRAM中運行的程序都歸結(jié)為BL1; 一種是將iRAM中三星加密的代碼bl1.bin作為BL1, iRAM中剩余的部分作為BL2, 本文采用后者, 他們的主要分工如下:
BL0: ARM的起始地址都是0地址, 三星的芯片一般將0地址映射到iROM中, BL0就是指iROM中固化的啟動代碼, 主要負責加載BL1
BL1: 三星對于bootloader的加密代碼bl1.bin, 要放在外設中uboot.bin的頭上, 和一部分uboot.bin一起加載到iRAM中運行.
BL2: 從(nand/sd/usb)中拷貝的uboot.bin頭最大14K到iRAM中代碼中除去bl1.bin后剩余的部分, 負責設置CPU為SVC模式, 關(guān)閉MMU, 關(guān)閉中斷, 關(guān)閉iCache, 關(guān)閉看門狗, 初始化DRAM,初始化時鐘, 初始化串口, 設置棧, 校驗BL2并將其搬移到DRAM高位地址, 重定位到DRAM中執(zhí)行BL3
BL3:是指在代碼重定向后在內(nèi)存中執(zhí)行的uboot的完整代碼, 負責初始化外設,更新向量表, 清BSS, 準備內(nèi)核啟動參數(shù), 加載并運行OS內(nèi)核
可以借助下圖理解這個流程
我們常說的uboot是一個兩階段bootloader,就是指上述的BL2和BL3. BL2主要做硬件直接相關(guān)的初始化,使用匯編編寫;BL3主要為操作系統(tǒng)的運行準備環(huán)境,主要用C編寫,這里以ARM平臺為例分析其啟動流程。下面是啟動過程中主要涉及的文件
延伸閱讀
學習是年輕人改變自己的最好方式
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26