Uboot學習筆記(二)Exynos4412啓動過程分析

Exynos4412啓動過程分析

簡介

注意:這部分不具有普適性,僅針對Exynos4412芯片,不同的芯片會有不同的啓動方式,但是都是比較類似的,會有細節上的不同。
這次Uboot的學習筆記我打算分爲4個部分。分別是Exynos4412啓動過程分析、Uboot編譯過程分析、Uboot啓動過程分析和Uboot引導內核分析。將對4412芯片從上電到加載Linux內核鏡像的過程進行分析,我的主要參考資料就是訊爲的視頻以及手冊、三星原廠datasheet以及網絡上的博客。
首先要指出不同的處理器在加載起Uboot前的操作是區別巨大的,不同的芯片會有不同的設計模式,啓動過程是各不相同的,但是加載起Uboot後的流程就區別不大了,所以我們學習的重點應該是Uboot的啓動過程分析和Uboot引導內核的分析;Uboot的編譯流程不同處理器的區別也不大,但這部分總的來說比較簡單;對於4412的啓動過程我們做到了解即可,這部分不同處理器的差別巨大,沒必要死扣一種。
這篇博客會分析Exynos4412的啓動過程,說實話Exynos4412的啓動過程是比較複雜的,三星在其中加入了自己的不開源加密文件,一個Uboot最終鏡像被分割成了四個部分,相比較來說imx6ull就會比較簡單(其實我也只是大概看了看,板子還沒有到手,到手以後會進行分析)。
Exynos4412的Uboot鏡像由四個部分組成(EMMC啓動模式),注意:下圖十分關鍵
在這裏插入圖片描述
除此以外還有一個在芯片內固化的重要存儲區域:iROM,這篇博客主要分析的是U-boot加載起來以前的部分,所以我們要分析iROM的流程、BL1的流程以及BL2的流程。
我們先放一張啓動的總體流程圖
在這裏插入圖片描述
這張圖片就是4412的整體啓動流程,首先iROM會讀取OM Pin來獲取系統的啓動加載方式,在iROM中還會進行一系列的初始化,在iROM的最後會對BL1的代碼進行校驗,校驗成功後會把BL1的代碼搬到Internal SRAM(內部SRAM)中執行,在BL1的最後會將OS(這裏的OS可能指的是用戶代碼而不是操作系統,因爲我們一般還會有BootLoader,在BootLoader的最後纔會加載操作系統)搬到外部的DRAM中運行,這是整個系統就跑起來了,我們可以看到BL1的OS代碼是放在外部的存儲介質中的,所以在iROM代碼中最重要的是完成對Controller的初始化,這樣才能從啓動介質中讀出BL1和以後的代碼。接下來我們對三個部分的代碼進行詳細的分析。

iROM

iROM是從地址0x0000_0000開始的一段地址空間,存放着被固化的三星寫好的程序。
在這裏插入圖片描述
iROM中的代碼會給板子搭建起執行arm代碼的基本環境,並從存儲介質(Nand、SD/MMC、eMMC、USB OTG)中下載BL1的代碼並進行校驗
執行流程如下:
在這裏插入圖片描述

  • Disable watchdog:關閉看門狗,在Uboot中不用進行喂狗操作
  • Disable IRQ’s and MMU:關閉中斷控制器和內存管理單元(MMU)
  • Disable D-cache, Enable I-cache:關閉數據Cache,使能指令Cache
  • Flush TLB’s and Invalidate caches:刷新TLB並失效caches
  • Make CORE1 idle:使其他核進入空閒狀態,只讓CPU0運行
  • Deep-stop or AFTR:這個是判斷是否在待機喚醒狀態,如果是的話直接跳轉到BL1(快速啓動)
  • Initialize Stack (IRQ, SVC):設置IRQ和SVC模式的棧空間(通過片內的ram來設置棧地址,0x0202_0100)
  • Initialize ZI/RW:初始化iROM程序中的一些變量(RW(read/write)是程序中的已初始化變量;ZI(zero)是程序中的未初始化的變量)
  • Register the function pointers:導出一些核心函數,這裏的函數主要是一些讀寫函數(用於讀寫存放BL1的存儲介質),函數如下:
    在這裏插入圖片描述
  • Get the reset status:獲取復位狀態
  • Set the clock divider & Set PLLs:設置時鐘分頻和鎖相環
  • Get bootmode (OM pin):獲取BOOT模式(四種介質中的哪一種),選擇方式如下,注意OM[6]是永遠拉低的
    在這裏插入圖片描述
  • 接下來的就是從介質中下載BL1,然後進行校驗,校驗成功的話就跳轉到BL1執行
    在這裏插入圖片描述

BL1的格式如上圖所示,Check Sum和Verify BL1的操作就是通過在BL1的Header裏放着checksum value,iROM通過計算校驗和並和Header裏的checksum value進行比較。
Decrypt BL1是通過密鑰來解密鏡像,使用 RSA(Rivest-Shamir-Adleman)公鑰加密算法;AES(高級加密標準)塊加密算法

我們在上圖中可以看到4412中是有一小塊內部SRAM的(256K),這段內存是不需要進行初始化的,可以直接使用,所以在iROM程序的最後就會將BL1拷貝到這段內部SRAM中運行
具體的片內內存情況如下:
在這裏插入圖片描述
這段內部SRAM從0x0202_0000開始,這個圖其實還是有點問題的,BL1上寫的是8K,這其實是4212的內存分佈圖,從0x0202_0000開始的5K是相同的,分別放着

  • 設備ID、iROM版本、函數指針
  • iROM棧
  • iROM中初始化的變量

BL1

BL1是由三星提供的二進制文件,是沒有源碼的,主要是爲了系統的安全才這麼設置,這個是比其它芯片多出來的一個部分(聽說ST的芯片好像也有這個部分)
BL1中的流程如下圖:
在這裏插入圖片描述

  • 判斷是否爲在待機喚醒狀態,如果是的話直接跳轉到BL2(快速啓動)
  • 從啓動設備中讀取BL2代碼
  • 判斷是否是sleep喚醒操作,如果是就直接跳轉到BL2,否則繼續執行
  • 進行安全性檢查和判斷完整性,這裏根據下圖看到BL2其實包含了BL2 Binary+Checksum+Signature+Padding,根據Signature去進行安全檢查,根據Checksum去判斷完整性:
    在這裏插入圖片描述

BL2

在BL1中對BL2進行檢查成功後跳轉到BL2執行,具體執行流程圖如下:
在這裏插入圖片描述
它的執行流程與BL1的流程類似,但是多出了設置時鐘和初始化DRAM的過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章