Arm芯片上电启动流程剖解
關鍵字:
stepping stone:(可以看做是Internal RAM)
IROM (Internal ROM):固化在CPU內部ROM里的一段代碼,它的運行叫做BL0.
IRAM:?因為IROM啟動運行的時候,外置SDRAM還沒有初始化好,而IRAM是可用的,因此必須要把BL1加載到IRAM中運行,由BL1對SDRAM進行初始化。ROM為什么不初始化SDRAM呢?那是因為支持的SDRAM規格是可變的,由固化代碼來初始化顯得不夠靈活,而且固化代碼往往代碼量比較小,因為越多越容易出BUG,出BUG就會導致SOC芯片重新掩膜tapout,一次可要好幾百萬人民幣呢。
BL0: (BootLoad 0階段),BL0做了些什么?
s5pc100芯片手冊見2.2FUNCTIONAL SEQUENCE,翻譯成中文如下
? ? ? 1.初始化PLL和時鐘,將其設定為固定值;
? ? ? 2.初始化棧和堆區域;
? ? ? 3.初始化指令Cache 控制器;
? ? ? 4.從外部起動設備中加載BL1;
? ? ? 5.如果起動安全機制開啟,則檢查BL1數據完整性;
? ? ? 6.如果校驗通過,則跳轉到0x34010地址處運行;
? ? ? 7.如果校驗失敗則停止。
BL1:? 從CPU上電起,把系統啟動過程分為3個階段BL0、BL1、BL2。BL0是固化在內部ROM上電就執行的一小段程序,BL0引導u-boot的第一個階段稱為BL1。通常加載到CPU 內的 IRAM中執行
BL2:?把u-boot的第二階段代碼用于引導內核的階段稱為BL2,通常加載到SDRAM中執行。
?
談到arm的啟動流程不得不說的是bootloader,但是我這篇文章主要來談談arm啟動流程的,所以bootloader只是跟大家簡介一下就ok。這篇文章我會談到以下內容:
1、bootloader簡介以及其作用
2、2440、6410、210當下比較常見的3款處理器的啟動流程進行簡單分析,通過這三款處理器的分析希望大家掌握arm處理器的啟動分析。
Ok我們進入主題
l? Bootloader簡介及其作用
在我看來bootloader的作用是初始化必要的硬件,引導內核啟動。(當然這是主要作用,今天的重點不在bootloader,所以在我后面的博文會繼續談到的)
l? 啟動流程分析
在分析啟動流程的時候我們將會使用的文檔是三星公司提供的芯片手冊,通過手冊我們搞清楚芯片的啟動。
在分析啟動流程之前我們首先要清楚不論是arm的何種處理器,其都是從0x0000 0000地址處開始執行程序的。下面的分析我將會通過三個方面:1、芯片支持的啟動方式2、地址布局3、啟動流程
1.?? 2440?
a)?? 啟動方式
由上圖可知,S3C2440支持兩種啟動模式:NAND和非NAND(這里是Nor Flash),具體采用的方式取決于OM0、OM1兩個引腳的狀態。
| ? | |
| ? |
?
?
b)?? 地址布局
我們知道arm從0地址出運行代碼那么我們的零地址處到底存放的是什么東西呢?我們通過地址布局圖來分析
從上圖我們可以清楚的看到左邊的是從Nor Flash啟動的地址布局,右邊是從NAND啟動的地址布局,因為Nor Flash內可以運行程序(Nor flash 地址線和數據線獨立,nand flash地址線/數據線復用),所以我們在放bootloader的時候放在0地址處即可,所以我們重點分析從NAND啟動。
c)?? 啟動流程
我們從地址布局圖中可以看到,當我們從NAND啟動的時候0地址處是BootSRAM(又叫做stepping stone墊腳石),當我們上電時其會做以下事情
上電后處理器自動將nandflash前4KB的內容復制到boot sram(I RAM,CPU內部RAM)開始執行,這一過程就是BL1加載過程(由CPU內部的 BL0 代碼程序完成)。
通過bootsram(即剛才復制進來的4k)來初始化相關硬件和寄存器從而訪問nandflash,接下來把剩余的bootloader復制到內存(SDRAM/DRAM)中 (即BL1->BL2),當stepping stone 里面的4KB執行完以后跳轉到內存繼續執行,完成系統的啟動。
2.?? 6410
a)?? 啟動方式
從上圖我們可以看到6410支持的啟動方式比較多有SROM(Nor Flash)啟動,oneNAND啟動,IROM,即內置ROM(IROM是處理器內部的固件/存儲器,但不是stepping stone)啟動。其中IROM中又有sd卡、NAND,我們可以配置相應的管腳去選擇其啟動方式。
b)?? 地址布局
從上圖我們可以發現在0地址處是一個鏡像區,不放置任何設備,當我們選擇不同的啟動方式的時候,其通過映射關系將對應的設備映射到鏡像區域。比如我們選擇從IROM啟動其就會將IROM映射到該區域。
c)?? 啟動流程
假設我們從NAND啟動,從啟動方式中我們可以知道從NAND啟動是屬于從IROM啟動的,所以當我們上電的時候其會做以下事情:
1.?? 將IROM映射到鏡像區
2.?? IROM中有芯片廠商寫好的BL0,由BL0將系統引導至啟動選項,然后將BL1(NAND中前8k)拷進stepping stone(IRAM,即內置RAM)進行運行
3.?? BL1將剩下的BL2拷進內存,當BL1執行完以后跳轉到內存繼續執行,完成系統的啟動。
D-TCM==數據緊密耦合內存 (Data Tightly Coupled Memory)。 TCM 是一段始終有效的連續內存區域(如果啟用了 TCM)。 TCM 用作系統的物理內存映射的一部分,不必由物理地址相同的外部存儲器來支持。因此,TCM 的行為與標記為直寫可高速緩存的內存區域的高速緩存不同。 在這類區域中,向 TCM 中的內存位置寫入時,不會發生任何外部寫入。 TCM 用于向處理器提供低延遲內存,它沒有高速緩存特有的不可預測性。 可以使用 TCM 來存放重要例程,如中斷處理例程或者極需要避免高速緩存不確定性的實時任務。此外,可以使用 TCM 來保存暫時寄存器數據、局部屬性不適合高速緩存的數據類型,以及中斷堆棧等重要數據結構。 有關 TCM 的完整體系結構描述,請參閱《ARM 體系結構參考手冊》以及處理器的《技術參考手冊》(Technical Reference Manual)。 參考:https://blog.csdn.net/otianshizairenjian/article/details/78330724對ARM緊致內存TCM的理解?
3.?? S5PV210
S5PV210屬于這一類系統,外掛SDRAM內存和NAND、SD卡等外存設備,系統和應用代碼等作為固件存放在外存設備中,并通過S5PV210內置的IROM啟動并逐步引導到SDRAM中。S5PV210的SPEC是《S5PV210_UM_REV1.1.pdf》,在其第29頁~30頁中描述了IROM和IRAM的內存映射圖。IRAM,即內置RAM,在啟動引導階段有兩個作用:一是IROM運行時使用的數據變量所在的區域,二是IROM,即BL0會將外存中的BL1引導到該區域中。因為IROM啟動運行的時候,外置SDRAM還沒有初始化好,而IRAM是可用的,因此必須要把BL1加載到IRAM中運行,由BL1對SDRAM進行初始化。IROM為什么不初始化SDRAM呢?那是因為支持的SDRAM規格是可變的,由固化代碼來初始化顯得不夠靈活,而且固化代碼往往代碼量比較小,因為越多越容易出BUG,出BUG就會導致SOC芯片重新掩膜tapout,一次可要好幾百萬人民幣呢。由內存映射圖可以得到:
IROM是64K,在0x0000-0000開始的區域,而IRAM是96K,在0xD0020000-0xD0037FFF。我們可以看到其地址布局和6410類似,采用了映射的方法。S5PV210的IROM的SPEC是《S5PV210_iROM_ApplicationNote_Preliminary.pdf》,其主要描述以下內容
?
?1. 啟動流程,分析如下:
??? 1)BL0位于IROM中,其選擇引導的介質受外圍引腳OM電平所決定。
其能引導的介質包括:nor,nand,onenand,SD/MMC等等。如下圖,0x2表示nand(page為2k byte,5個command周期,8bit ECC)啟動,0xc表示SD/MMC。OM的值可以通過讀寄存器0xE000-0004得到。
???????????????
2)根據OM的值,IROM中的BL0選擇其固話的對應驅動將對應介質的前16K代碼數據讀到IRAM中。引導代碼之后會進行校驗,校驗和BL1的長度信息放在16K代碼數據的最前面16個字節。為什么需要長度?因為校驗是對確定長度的內容進行計算得到,而BL1的有效代碼數據可能并沒有16K。BL1頭部信息和校驗算法如下圖:
?????????????????
????????????加載BL1之后,BL0會將給PC賦值為0xd0020010,即BL1代碼真正的入口應該設置鏈接到0xd0020010。在編譯鏈接生存BL1之后需要用專門的工具計算出BL1的長度和校驗碼,并填充到BL1的頭部,在uboot中稱為NAND_SPL.BIN。
3)啟動過程中的示意圖的第三步只是一種方案的建議,在實際的啟動模塊中,BL2一般比較大,因為其包括引導操作系統,還包括在啟動階段支持下載等交互功能,所以BL2會大于IRAM中剩下的80K,因此,BL1執行時會先初始化好SDRAM,然后將BL2引導到SDRAM。因此圖中的第三步示意圖并不準確。BL1執行時MMU是關閉的,其在建立好臨時頁表后,會開啟MMU,并跳轉到BL2開始執行。
4)BL2會提供與用戶交互的模式命令,一般用于研發人員調試,如果是真正的產品則沒有這種模式,直接開始引導OS到SDRAM。并跳轉到OS開始執行。
5)一般的啟動流程圖如下(這個圖很贊,可以仔細看看):
?????????????????????????????????????
???????????????從上圖可以得知,當引導OM所對應的介質的BL1失敗(如介質接口有問題、校驗失敗等)時,還有另外的備選引導方案,即2nd boot,那就是USB引導和串口引導,這里不再展開。
2. IROM除了引導之后,還做了一些硬件和軟件環境初始化工作。主要流程包括:
1)關閉看門狗
????????????2)初始化指令cache,開啟指令cache
??????????? 3)初始化 IRAM中的棧(中斷棧、SVC棧)和堆,異常向量注冊表等。具體如下圖:
??????????? ?????????????????????????????
???????????IROM運行是處于SVC模式。這里的exception vector table并不是異常向量表,而應該稱為異常向量注冊表。因為異常向量表是在IROM的起始位置上,即0x00000000開始的地方,如下所示,IROM建立起的環境只能支持中斷(異常的一種)注冊,即注冊到0xd0037418,對于其他異常的支持需要在啟動或者OS階段進行重建,并將其定位到SDRAM區域,并設置異常向量的基地址(通過改變協處理器P15的C12-Vector Base Address Register)指向該區域。
?????????? _start: b?reset
??????????????????????.word 0x0
??????????????????????.word 0x0
??????????????????????.word 0x0
??????????????????????.word 0x0
??????????????????????.word 0x0
??????????????????????ldr?pc, _irq
??????????????????????.word 0x0
??????????? 4)填充好IRAM的塊設備讀接口區域。如上圖,0xd0037f80開始的128個字節存放的是塊設備的拷貝函數地址,如nand,sd/mmc等的讀接口地址。其用于后續BL1和BL2使用。即BL1和BL2代碼不需要實現外存設備的讀驅動函數,只需要調用IROM的接口就可以了。SPEC的p14-p18具體描述了各種不同的介質設備的操作接口地址以及相關的信息。
?????????? 5)開啟PLL,初始化系統時鐘。
?????????? 6)copy 16k字節的BL1到 IRAM。
????????? ?7)對BL1進行校驗,即計算BL1的校驗值,并與BL1的頭部的校驗值進行比較,失敗即會跳到2nd boot中去引導,成功即跳到BL1的0xd0020010執行。
?
轉載:
Arm啟動流程解析
ARM處理器啟動分析(BL0/BL1/BL2)
擴展:
系統引導時為什么要關閉I/D Caches?
ARM-I/Dcache, MMU關系
Arm I/D cache 研究
ARM 官網支持
總結
以上是生活随笔為你收集整理的Arm芯片上电启动流程剖解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果app禁止手势退出
- 下一篇: softer nms论文阅读Boundi