linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)
轉(zhuǎn)自:http://blog.csdn.net/radianceblau/article/details/73229005
http://www.aiuxian.com/article/p-1414261.html
http://www.xuebuyuan.com/2209890.html
對(duì)于嵌入式工程師了解芯片啟動(dòng)過程是十分有必要的,在分析、調(diào)試各種問題的時(shí)候都有可能涉及到這方面的知識(shí)。同時(shí)這部分知識(shí)也是比較復(fù)雜的,因?yàn)槠渲猩婕暗叫酒瑑?nèi)部架構(gòu),啟動(dòng)各個(gè)階段軟件代碼執(zhí)行順序,啟動(dòng)模式等等。下面以比較常用的Qualcomm MSM8953芯片的啟動(dòng)過程為例,進(jìn)行宏觀分析(大部分翻譯了高通的手冊(cè)^-^),下一篇文章進(jìn)行代碼分析。
處理器核心
可以看到MSM8953中的處理器有5個(gè),分別為:
1, APPS Cortex A53 core,運(yùn)行android
2, RPM(Resource Power Manager) CortexM3 core,主要用于低功耗應(yīng)用
3, Modem(MSS_QDSP6) 高通自有指令集處理器,處理3G、4G通信協(xié)議等
4, Pronto(WCNSS) 處理wifi相關(guān)代碼
5, LPASS 音頻相關(guān)
對(duì)映下面芯片硬件結(jié)構(gòu)圖中各個(gè)處理器的框圖來看就很清晰了。
啟動(dòng)相關(guān)image介紹
1,PBL(Primary Boot Loader) 位于rom中,是芯片上電后執(zhí)行的真正第一行代碼,在正常啟動(dòng)流程中會(huì)加載SBL1。如果啟動(dòng)異常會(huì)虛擬出9008端口用于緊急下載(短接板子上的force_boot_from_usb引腳(MSM8953 為gpio37)到1.8v可以強(qiáng)制進(jìn)入緊急下載模式)。
2,SBL1(Second BootLoader stage 1) 位于eMMC中,由PBL加載,初始化buses、DDR、clocks等,會(huì)虛擬出9006端口,用于不能開機(jī)時(shí)dump ram
3,QSEE/TrustZone 安全相關(guān),如fuse
4,DEVCFG OEM配置信息(如OEMLock)
6, Debug Policy 調(diào)試相關(guān)
7, APPSBL 即為BootLoader,目前使用LK(littlekernel)
8,HLOS(High LevelOperating System) 即為L(zhǎng)inux/Android
9,Modem PBL 即為Modem處理器的PBL
10,MBA(Modem BootAuthenticator) Modem處理器啟動(dòng)鑒權(quán)
啟動(dòng)流程
1, 系統(tǒng)上電,使MSM8953從上電復(fù)位開始運(yùn)行。
2, 在Cortex A53中運(yùn)行的PBL會(huì)加載:
a, 從啟動(dòng)設(shè)備(如eMMC)加載SBL1 segment1到L2(即為TCM)
b, 加載SBL1 segment2到RPM處理器的RAM中。
3, SBL1 segment1會(huì)初始化DDR,然后完成如下加載:
a, 從啟動(dòng)設(shè)備加載QSEE image到DDR
b, 從啟動(dòng)設(shè)備加載DEVCFG image到DDR
c, 從啟動(dòng)設(shè)備加載Debug Policy image到DDR
d, 從啟動(dòng)設(shè)備加載HLOS APPSBL image到DDR
e, 從啟動(dòng)設(shè)備加載RPMfirmware image到RPM的RAM中。
4, SBL1移交運(yùn)行控制權(quán)給QSEE。QSEE建立安全運(yùn)行環(huán)境,配置xPU,支持fuse。
a, SBL1運(yùn)行在AArch32(譯者注:名詞相關(guān)知識(shí)見文末“附件介紹一”)模式,而QSEE運(yùn)行在AArch64模式。為了切換到AArch64模式,SBL1會(huì)啟動(dòng)重映射器,操作RMR寄存器,然后觸發(fā)warm-reset,QSEE就能夠運(yùn)行在AArch64模式了。
5, QSEE通知RPM啟動(dòng)RPM 固件的執(zhí)行。
6, QSEE移交運(yùn)行控制權(quán)給HLOS APPSBL。
a, APPSBL只能在AArch32模式開始運(yùn)行。
b, 這時(shí)AArch32的運(yùn)行模式切換是在EL3/Monitor模式(譯者注:名詞相關(guān)知識(shí)見文末“附件介紹二”)完成的。通過查看APPSBL的ELF頭能夠得知其需要運(yùn)行在32位指令集架構(gòu)下。EL3/Monitor模式改變到32位模式,然后再啟動(dòng)APPSBL。
7, APPSBL加載、驗(yàn)證kernel。APPSBL通過SCM調(diào)用改變到HLOS kernel需要的AArch64模式。這和之前LK直接跳轉(zhuǎn)到kernel運(yùn)行是不同的。
8, HLOS kernel通過PIL加載MBA到DDR
9, HLOS kernel對(duì)Hexagon modem DSP進(jìn)行解復(fù)位。
10,Modem PBL繼續(xù)它的啟動(dòng)。
11,HLOS kernel 通過PIL加載AMSS modemimage到DDR
12,Modem PBL驗(yàn)證MBA然后跳轉(zhuǎn)到MBA。
13,HLOS通過PIL加載WCNSS(Pronto)image到DDR
14,HLOS對(duì)WCNSS(Pronto)進(jìn)行解復(fù)位以便Prontoimage開始執(zhí)行。
15,HLOS通過PIL加載LPASS image到DDR
16,HLOS對(duì)LPSAA進(jìn)行解復(fù)位以便LPASSimage開始執(zhí)行。
下面是流程的簡(jiǎn)化圖,其中區(qū)分了AArch32和AArch64位的QSEE/TrustZone
關(guān)于eMMC和DDR的初始化時(shí)間問題
從上面的描述中已經(jīng)可以看清,為避免迷惑,在分離出來看看:
1,PBL中是含有eMMC驅(qū)動(dòng)的,有訪問eMMC的能力,自身運(yùn)行在MCU內(nèi)部SRAM中。
2,除了PBL程序的img在MCU片內(nèi)ROM外,其余img均存儲(chǔ)在eMMC中。
3,PBL首先從eMMC加載SBL1到L2(內(nèi)部緩存并非DDR),SBL1同樣運(yùn)行在片內(nèi)SRAM。
4,有SBL1初始化DDR各種時(shí)序后,DDR自此可用(eMMC一直可用)
5,再由SBL1加載其余各個(gè)img到DDR,然后按照linux的正常順序啟動(dòng)^-^....
附加介紹一:AArch64、AArch32
AArch64是ARMv8架構(gòu)的一種執(zhí)行狀態(tài)。
為了更廣泛地向企業(yè)領(lǐng)域推進(jìn),需要引入64位構(gòu)架。同時(shí)也需要在ARMv8架構(gòu)中引入新的AArch64執(zhí)行狀態(tài)。AArch64不是一個(gè)單純的32位ARM構(gòu)架擴(kuò)展,而是ARMv8內(nèi)全新的構(gòu)架,完全使用全新的A64指令集。這些都源自于多年對(duì)現(xiàn)代構(gòu)架設(shè)計(jì)的深入研究。更重要的是,AArch64作為一個(gè)分離出的執(zhí)行狀態(tài),意味著一些未來的處理器可能不支持舊的AArch32執(zhí)行狀態(tài)。雖然最初的64位ARM處理器將會(huì)完全向后兼容,但我們大膽且前瞻性地將AArch64作為在ARMv8處理器中唯一的執(zhí)行狀態(tài)。我們?cè)谶@些系統(tǒng)中將不支持32位執(zhí)行狀態(tài),這將使許多有益的實(shí)現(xiàn)得到權(quán)衡,如默認(rèn)情況下,使用一個(gè)較大的64K大小的頁(yè)面,并會(huì)使得純凈的64位ARM服務(wù)器系統(tǒng)不受遺留代碼的影響。立即進(jìn)行這種劃分是很重要的,因?yàn)橛锌赡茉谖磥韼啄陜?nèi)將出現(xiàn)僅支持64位的服務(wù)器系統(tǒng)。沒有必要在新的64位架構(gòu)中去實(shí)現(xiàn)一個(gè)完整的32位流水線,這將會(huì)提高未來ARM服務(wù)器系統(tǒng)的能效。這樣回想起來,AArch64作為在Fedora ARM項(xiàng)目中被支持的ARM構(gòu)架是一個(gè)很自然的過程:armv5tel、armv7hl、aarch64。新的架構(gòu)被命名為:aarch64,這同ARM自己選擇的主線命名方式保持一致,同時(shí)也考慮到了ARM架構(gòu)名與ARM商標(biāo)分開的期望。
ARMv8-A將64位架構(gòu)支持引入ARM架構(gòu)中,其中包括:
64 位通用寄存器、SP(堆棧指針)和 PC(程序計(jì)數(shù)器)
64 位數(shù)據(jù)處理和擴(kuò)展的虛擬尋址
兩種主要執(zhí)行狀態(tài):
AArch64 - 64 位執(zhí)行狀態(tài),包括該狀態(tài)的異常模型、內(nèi)存模型、程序員模型和指令集支持
AArch32 — 32 位執(zhí)行狀態(tài),包括該狀態(tài)的異常模型、內(nèi)存模型、程序員模型和指令集支持
這些執(zhí)行狀態(tài)支持三個(gè)主要指令集
A32(或 ARM):32 位固定長(zhǎng)度指令集,通過不同架構(gòu)變體增強(qiáng)部分 32 位架構(gòu)執(zhí)行環(huán)境現(xiàn)在稱為 AArch32。
T32 (Thumb) 是以 16 位固定長(zhǎng)度指令集的形式引入的,隨后在引入 Thumb-2 技術(shù)時(shí)增強(qiáng)為 16 位和 32 位混合長(zhǎng)度指令集。部分 32 位架構(gòu)執(zhí)行環(huán)境現(xiàn)在稱為 AArch32。
A64:提供與 ARM 和 Thumb 指令集類似功能的 32 位固定長(zhǎng)度指令集。隨 ARMv8-A 一起引入,它是一種 AArch64 指令集。
ARM ISA 不斷改進(jìn),以滿足前沿應(yīng)用程序開發(fā)人員日益增長(zhǎng)的要求,同時(shí)保留了必要的向后兼容性,以保護(hù)軟件開發(fā)投資。在 ARMv8-A 中,對(duì) A32 和 T32 進(jìn)行了一些增補(bǔ),以保持與 A64 指令集一致。
附件介紹二:Exception Level
?ARMv8定義EL0-EL3共4個(gè)Exception Level來控制PE的行為.
|
ELx(x<4),x越大等級(jí)越高,執(zhí)行特權(quán)越高 |
|
執(zhí)行在EL0稱為非特權(quán)執(zhí)行 |
|
EL2沒有Secure state,只有Non-secure state |
|
EL3只有Secure state,實(shí)現(xiàn)EL0/EL1的Secure和Non-secure之間的切換 |
|
EL0 & EL1必須要實(shí)現(xiàn),EL2/EL3則是可選實(shí)現(xiàn) |
Exception Level與Security
|
Exception Level |
|
|
EL0 |
Application |
|
EL1 |
Linuxkernel- OS |
|
EL2 |
Hypervisor(可以理解為上面跑多個(gè)虛擬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,可起到物理屏障安全隔離作用 |
關(guān)于ARMv8架構(gòu)的知識(shí),推薦如下博客:
http://blog.csdn.net/forever_2015/article/details/50285865
總結(jié)
以上是生活随笔為你收集整理的linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Salesforce 主要发展历史
- 下一篇: 管理大师彼得·德鲁克:做好管理