前言
高通芯片平臺種類衆多涵蓋低端到高端的各種檔次種類繁多:低端有諸如8909,中端有8916、8929、8937等,高端的有8953、8953、8953pro、8993,8996、8996pro。從存儲介質上講,從早期emmc慢慢發展到emcp最終由向ufs轉化的趨勢,運行位數更是從早期的32位全體過渡到64位地址總線。科技發展日新月異成果遍地!
也正是由於技術和平臺的差異較大,很難通過一篇文章來窮盡所有高通平臺的流程。好在所有的chip在boot時有很大的通性,便於舉一反三,故本文將以2017年正在使用的Qcom平臺爲例,帶領大家從宏觀上把握開機流程的核心。
子系統模塊架構
要了解高通的平臺,必須先了解下芯片中集成了那些子系統(SubSystem)。與Intel的做法不同,高通芯片中所包含的子系統數量多,集成度高,這些子系統都有各自獨立的cpu,只要在開機過程中通過主cpu子系統(APPS)引導/燒錄進對應的firmware,就可以地獨立運行起來。
在較新的高通芯片中較常見到的子系統(SubSystem)有下面這些:
SubSystem | Function |
---|---|
APPS | (Application Processer Subsystem) 主CPU |
RPM | (Resource Power Manager) 電源管理模塊(帶獨立cpu) |
Venus | 高通的圖像處理模塊 |
LPASS | (LowPower Audio Subsystem)音頻處理模塊 |
WCNSS (Pronto) | Wifi模塊 |
Modem | Modem處理器或稱之爲baseband |
TZ | (TrustZone) Arm平臺負責Security的Cpu,主系統可通過scm call與之通訊獲取想要的數據 |
Boot流程
既然芯片中集成了這麼多顆cpu,講解開機流程的核心就演變爲講解主cpu是如何逐步引導子cpu完整boot的流程了。
- 按PowerKey引導主CPU Reset
- cpu抓取存取器(emmc or ufs)中已預先燒入的sbl1 fw 執行。
- 將sbl1fw加載到L2緩存
- 將rpm的初始化引導代碼(存放在sbl1中)加載到rpm子系統中
- jump到L2中執行sbl1(因爲DDR還沒初始化,所以此時在cache中運行最爲方便)
- sbl1開始初始化DDR爲後續大內存的使用代碼提供運行環境
- sbl1將TZ img加載到DDR中
- sbl1將RPM的firmware(img)導入rpm子系統中
- sbl1將HLOS APPSBL Image(指的是lk即little kernel,有人習慣稱之爲aboot或是大家嘗叫的BootLoader;其中的HLOS是Qcom常用的說法,指的是High-Level Operationg System)引導進DDR
- sbl1將執行權轉交給TZ,完成系統安全環境(TrustZone)的建立、xpu的初始化和fuse的代碼支援(security boot)
- TZ開始設置memory和io接口的訪問權限,並通知RPM子系統開始運行
- TZ將引導執行HLOS APPSBL(LK)代碼,並轉移執行權到LK
LK根據此時用戶的按鍵行爲(是否長按音量鍵等)決定下一步的運行模式。
Boot模式一般有如下三種: 1:Normal Boot(boot進kernel) 2:Fastboot Mode 3:Recovery Mode 我們這裏將只分析Normal Boot的情況
- 1
- 2
- 3
- 4
- 5
- 6
LK加載Kernel
- LK通過執行SCM call將執行權轉交給kernel
- Kernel通過PIL(Peripheral image loader)將MBA(Modem Boot Authenticator)加載到DDR
- Kernel開始warm reset(warm reset DDR 不會掉電,內存數據保留) Modem的Cpu以便MBA開始boot流程,等待Modem完整Firmware的到來
- Kernel通過PIL加載Modem img到DDR
- Modem cpu開始正常啓動
- Kernel通過PIL加載WCNSS img到DDR,然後warm reset wcnss子系統以便WCNSS img被正常執行
- Kernel通過PIL加載LPASS img到DDR,然後warm reset LPASS子系統以便LPASS img被正常執行
… - Kernel通過PIL加載並執行Venus img
- kernel繼續正常boot,調用init和zygote將android系統調用起來
這樣一來,所有的子系統都正常開始執行,並且我們有了一個security的環境(TZ),來保證與用戶隱私和權限相關的data會非常安全。
總結
上面的流程是基於中高端高通平臺的通用流程,有些細節在不同平臺上有細小的區別故沒有特意展開。在8996平臺上,高通引入了xbl這樣的新機制替代了sbl1,但他們功能類似,行爲相仿。
每個子系統由於都是獨立的cpu,可能有些讀者會產生這樣的疑惑:萬一某個子系統運行不正常,那Kernel如何才能對他們進行有效監控和管理呢?高通引入了QMI(Qcom Message Interface)的接口,讓各個子系統可以通過其進行較爲高效的數據交換,當然這些數據是可以包含系統日誌(log)的,這樣我們就可以對其進行一定程度上的管理和監控了。當然,我們還有一系列的driver節點,可以通過其對子系統進行reset和clock的管理。最最重要的是,每個子系統都提供了一個sub-system restart的監控節點,這樣只要某個子系統異常宕機(例如modem偶爾重啓,用戶可能看到短暫的無服務),我們可以通過modem的引導程序,將modem子系統的整個運行內存狀態完整的dump出來,這樣就可以分析crash前的所有變量和堆棧狀態了。
瞭解高通平臺的boot流程,對做bsp的同仁來說是十分有必要的,我們bring up某個新平臺的EVB主板時,有了基礎知識才能很找到不開機時的問題點,才能儘快進行針對性的debug。
順便分享點經驗:電池電量,電池id電阻,DDR是否有部分虛焊點是常常導致無法開機的元兇。這些問題可以通過log或在edl mode下燒入不同的firehouse來快速驗證。
歡迎大家提出寶貴意見和建議,共同成長。
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>