linux驅動由淺入深系列:PBL-SBL1-(bootloader)LK-Android啓動過程詳解之一(高通MSM8953啓動實例)

轉自:http://blog.csdn.net/radianceblau/article/details/73229005html

          http://www.aiuxian.com/article/p-1414261.htmllinux

          http://www.xuebuyuan.com/2209890.htmlandroid

 

 

對於嵌入式工程師瞭解芯片啓動過程是十分有必要的,在分析、調試各類問題的時候都有可能涉及到這方面的知識。同時這部分知識也是比較複雜的,由於其中涉及到芯片內部架構,啓動各個階段軟件代碼執行順序,啓動模式等等。下面以比較經常使用的Qualcomm MSM8953芯片的啓動過程爲例,進行宏觀分析(大部分翻譯了高通的手冊^-^),下一篇文章進行代碼分析。程序員

 

處理器核心緩存

能夠看到MSM8953中的處理器有5個,分別爲:安全

1,  APPS           Cortex A53 core,運行android服務器

2,  RPM(Resource Power Manager)      CortexM3 core,主要用於低功耗應用架構

3,  Modem(MSS_QDSP6)        高通自有指令集處理器,處理3G、4G通訊協議等spa

4,  Pronto(WCNSS) 處理wifi相關代碼.net

5,  LPASS        音頻相關

對映下面芯片硬件結構圖中各個處理器的框圖來看就很清晰了。

 

啓動相關image介紹

1,PBL(Primary Boot Loader)   位於rom中,是芯片上電後執行的真正第一行代碼,在正常啓動流程中會加載SBL1。若是啓動異常會虛擬出9008端口用於緊急下載(短接板子上的force_boot_from_usb引腳(MSM8953 爲gpio37)到1.8v能夠強制進入緊急下載模式)。

2,SBL1(Second BootLoader stage 1) 位於eMMC中,由PBL加載,初始化buses、DDR、clocks等,會虛擬出9006端口,用於不能開機時dump ram

3,QSEE/TrustZone  安全相關,如fuse

4,DEVCFG OEM配置信息(如OEMLock)

6,  Debug Policy 調試相關

7,  APPSBL      即爲BootLoader,目前使用LK(littlekernel)

8,HLOS(High LevelOperating System) 即爲Linux/Android

9,Modem PBL  即爲Modem處理器的PBL

10,MBA(Modem BootAuthenticator) Modem處理器啓動鑑權

 

啓動流程

1,  系統上電,使MSM8953從上電覆位開始運行。

2,  在Cortex A53中運行的PBL會加載:

        a,  從啓動設備(如eMMC)加載SBL1 segment1到L2(即爲TCM)

        b,  加載SBL1 segment2到RPM處理器的RAM中。

3,  SBL1 segment1會初始化DDR,而後完成以下加載:

        a,  從啓動設備加載QSEE image到DDR

        b,  從啓動設備加載DEVCFG image到DDR

        c,  從啓動設備加載Debug Policy image到DDR

        d,  從啓動設備加載HLOS APPSBL image到DDR

        e,  從啓動設備加載RPMfirmware image到RPM的RAM中。

4,  SBL1移交運行控制權給QSEE。QSEE創建安全運行環境,配置xPU,支持fuse。

        a,  SBL1運行在AArch32(譯者注:名詞相關知識見文末「附件介紹一」)模式,而QSEE運行在AArch64模式。爲了切換到AArch64模式,SBL1會啓動重映射器,操做RMR寄存器,而後觸發warm-reset,QSEE就可以運行在AArch64模式了。

5,  QSEE通知RPM啓動RPM 固件的執行。

6,  QSEE移交運行控制權給HLOS APPSBL。

        a,  APPSBL只能在AArch32模式開始運行。

        b,  這時AArch32的運行模式切換是在EL3/Monitor模式(譯者注:名詞相關知識見文末「附件介紹二」)完成的。經過查看APPSBL的ELF頭可以得知其須要運行在32位指令集架構下。EL3/Monitor模式改變到32位模式,而後再啓動APPSBL。

7,  APPSBL加載、驗證kernel。APPSBL經過SCM調用改變到HLOS kernel須要的AArch64模式。這和以前LK直接跳轉到kernel運行是不一樣的。

8,  HLOS kernel經過PIL加載MBA到DDR

9,  HLOS kernel對Hexagon modem DSP進行解復位。

10,Modem PBL繼續它的啓動。

11,HLOS kernel 經過PIL加載AMSS modemimage到DDR

12,Modem PBL驗證MBA而後跳轉到MBA。

13,HLOS經過PIL加載WCNSS(Pronto)image到DDR

14,HLOS對WCNSS(Pronto)進行解復位以便Prontoimage開始執行。

15,HLOS經過PIL加載LPASS image到DDR

16,HLOS對LPSAA進行解復位以便LPASSimage開始執行。

 

下面是流程的簡化圖,其中區分了AArch32和AArch64位的QSEE/TrustZone

 

關於eMMC和DDR的初始化時間問題

從上面的描述中已經能夠看清,爲避免迷惑,在分離出來看看:

1,PBL中是含有eMMC驅動的,有訪問eMMC的能力,自身運行在MCU內部SRAM中。

2,除了PBL程序的img在MCU片內ROM外,其他img均存儲在eMMC中。

3,PBL首先從eMMC加載SBL1到L2(內部緩存並不是DDR),SBL1一樣運行在片內SRAM。

4,有SBL1初始化DDR各類時序後,DDR自此可用(eMMC一直可用)

5,再由SBL1加載其他各個img到DDR,而後按照linux的正常順序啓動^-^....

 

附加介紹一:AArch6四、AArch32

AArch64是ARMv8架構的一種執行狀態。

爲了更普遍地向企業領域推動,須要引入 64位構架。同時也須要在 ARMv8架構中引入新的 AArch64執行狀態。AArch64不是一個單純的 32位 ARM構架擴展,而是 ARMv8內全新的構架,徹底使用全新的 A64指令集。這些都源自於多年對現代構架設計的深刻研究。更重要的是, AArch64做爲一個分離出的執行狀態,意味着一些將來的處理器可能不支持舊的 AArch32執行狀態。雖然最初的 64位 ARM處理器將會徹底向後兼容,但咱們大膽且前瞻性地將 AArch64做爲在 ARMv8處理器中惟一的執行狀態。咱們在這些系統中將不支持 32位執行狀態,這將使許多有益的實現獲得權衡,如默認狀況下,使用一個較大的 64K大小的頁面,並會使得純淨的 64位 ARM服務器系統不受遺留代碼的影響。當即進行這種劃分是很重要的,由於有可能在將來幾年內將出現僅支持 64位的服務器系統。沒有必要在新的 64位架構中去實現一個完整的 32位流水線,這將會提升將來 ARM服務器系統的能效。這樣回想起來, AArch64做爲在 Fedora ARM項目中被支持的 ARM構架是一個很天然的過程: armv5tel、armv7hl、aarch64。新的架構被命名爲:aarch64,這同 ARM 本身選擇的主線命名方式保持一致,同時也考慮到了 ARM架構名與 ARM商標分開的指望。

ARMv8-A 將 64位架構支持引入 ARM架構中,其中包括:

  • 64 位通用寄存器、SP(堆棧指針)和 PC(程序計數器)
  • 64 位數據處理和擴展的虛擬尋址

兩種主要執行狀態:

  • AArch64 - 64 位執行狀態,包括該狀態的異常模型、內存模型、程序員模型和指令集支持
  • AArch32 — 32 位執行狀態,包括該狀態的異常模型、內存模型、程序員模型和指令集支持

這些執行狀態支持三個主要指令集

  • A32(或 ARM):32 位固定長度指令集,經過不一樣架構變體加強部分 32 位架構執行環境如今稱爲 AArch32。
  • T32 (Thumb) 是以 16 位固定長度指令集的形式引入的,隨後在引入 Thumb-2 技術時加強爲 16 位和 32 位混合長度指令集。部分 32 位架構執行環境如今稱爲 AArch32。
  • A64:提供與 ARM 和 Thumb 指令集相似功能的 32 位固定長度指令集。隨 ARMv8-A 一塊兒引入,它是一種 AArch64 指令集。 
    ARM ISA 不斷改進,以知足前沿應用程序開發人員日益增加的要求,同時保留了必要的向後兼容性,以保護軟件開發投資。在 ARMv8-A 中,對 A32 和 T32 進行了一些增補,以保持與 A64 指令集一致。

 

附件介紹二:Exception Level

 

• ARMv8定義EL0-EL3共 4個Exception Level來控制PE的行爲.

ELx(x<4),x越大等級越高,執行特權越高

執行在EL0稱爲非特權執行

EL2 沒有Secure state,只有Non-secure state

EL3 只有Secure state,實現EL0/EL1的Secure 和Non-secure之間的切換

EL0 & EL1 必需要實現,EL2/EL3則是可選實現

 Exception Level 與Security

Exception Level

EL0

Application

EL1

Linux kernel- OS

EL2

Hypervisor (能夠理解爲上面跑多個虛擬OS)

EL3

Secure Monitor(ARM Trusted Firmware)

Security

Non-secure

EL0/EL1/EL2, 只能訪問Non-secure memory

Secure

EL0/EL1/EL3, 能夠訪問Non-secure memory & Secure memory,可起到物理屏障安全隔離做用

 

關於ARMv8架構的知識,推薦以下博客:

http://blog.csdn.net/forever_2015/article/details/50285865

相關文章
相關標籤/搜索