本文以s5pv210這款SOC為例,分析了其啟動流程
在s5pv210的SOC內部,存在着一個內部的ROM和一個內部的RAM
- 這個內部的ROM叫做 IROM,它是norflash的一種。其不同於板子上外接的inand/sd(mmc),它優點是一上電無需初始化即可使用,缺點是又小又貴…
- 這個內部的RAM叫做 SRAM,其不同於板子上外接的 DDR(DRAM),它優點也是一上電無需初始化即可使用…..缺點也是又小又貴…
由於它倆的優異特性,一上電后的很多工作就由它倆來負責了
1.判斷啟動介質
- 首先一上電,cpu先從SOC內部的IROM中執行預先設置的代碼(s5pv210稱其為BL0),初始化CPU時鍾、關看門狗、並且通過讀取特定gpio來判斷啟動介質。(注:IROM中代碼可以直接執行,不用放到SRAM中)
- 對於有些SOC來說,他們不通過讀gpio來判斷啟動介質,而是根據啟動介質的優先級,來依次嘗試從各個啟動介質啟動,直到某個啟動介質成功啟動SOC
2.加載第一部分引導代碼
- 判斷完啟動介質后,cpu會執行IROM中相應啟動介質初始化代碼,並從啟動介質的特定扇區開始讀取U-boot頭部的少量代碼(對於s5pv210來說是16k的代碼,稱其為BL1),然后放到至SRAM並執行。近年來的U-boot將這一小段代碼稱為“SPL”,並開始支持單獨編譯它
- 為什么不直接加載整個U-boot呢?因為大部分SOC出於成本考慮,IROM做的不大,放不下整個U-boot
- 總體來說由於各個SOC這一步大致相同,但可能都有細微的區別,具體要去參照手冊。下面以s5pv210為例來說說對第一部分引導代碼的一些細節要求:
當啟動介質為SD/MMC時,第0個扇區必須保留,IROM中的代碼會從第1個扇區開始讀BL1,啟動介質的空間分配如下圖所示
而其他的啟動介質則是直接從第0個扇區存放BL1,IROM中的代碼會也從第0個扇區開始讀BL1,啟動介質的空間分配如下圖所示
-
然后,我們要把第一部分引導代碼放到SRAM中的某個地址,通常SOC都會在代碼頭加上校驗頭,之所以要校驗頭是為了防止從啟動介質讀取時出錯,一般是使用廠商的打包工具來添加校驗頭的,或者是在U-boot源碼內添加了校驗頭。對於s5pv210來說,BL1的前16個字節是校驗位,真正的代碼是從D002_0010開始的。
-
至此,Soc主導的啟動過程結束,接下來就靠SRAM中的第一部分引導代碼來重定位了,接下來將加載整個U-boot,並引導內核鏡像。詳細流程可以去看U-boot的源碼分析和U-boot引導內核流程分析.
- 來源:https://www.veryarm.com/41643.html