高通Andriod開機流程與鏡像說明


# 高通Andriod開機流程與鏡像說明

Android鏡像說明

Android設備刷機時都需要ROM包,ROM包下面有很多的.img和其他的相關鏡像文件,其中這里面包含了Android很多的分區,Android鏡像文件是通過源碼編譯生成的,下面是ROM包各個鏡像的作用:

鏡像文件 說明
boot.img boot分區,包括內核文件和虛擬內存盤Ramdisk,負責設備開機,可在recovery模式進行擦除,重新安裝帶有boot分區的新系統
system.img system分區,包含Android系統的用戶界面以及設置上的一些預裝系統應用
recovery.img recovery分區,替代啟動分區,執行恢復和維護系統的一些操作
userdata.img data分區,用於保存用戶的數據,例如聯系人,短信,設置偏好和應用程序存放的地方
cache.img cache分區,用於放置系統頻繁訪問的數據和應用程序組件的分區
persist.img persist分區包含了設備的傳感器和信號部分的驅動程序,例如wifi,藍牙連接都有關系
splash.img 開機畫面文件
NON-HLOS.bin modem image負責處理通訊協議相關的基帶鏡像
prog_emmc_firehose_8953_ddr.mbn QFIL軟件燒錄系統的時候,需要用到此文件,應該是關於EMMC、DDR的配置參數相關的
sbl1.mbn 硬件的初始化,並且保存加載其他模塊信息的順序
tz.mbn trustzone是ARM TrustZone® 技術是系統范圍的安全方法,基於安全需求和引導模式配置XPU,NAND MPU,它和其他模塊代碼運行在相互隔離的區域,主要實現底層很多安全性特性
emmc_appsboot.mbn bootloader文件,進入fastboot模式相關文件
rpm.mbn 電源管理器,是高通MSM平台另外加的一塊芯片,雖然與AP芯片打包在一起,但其是一個獨立的ARM Core。負責與SMP,MPM交互進入睡眠或者喚醒整個系統
gpt_backup0.bin 備份gpt頭和分區表
gpt_main0.bin GPT頭和分區表
patch0.xml 服務端返回的具體磁盤大小打上最后一個分區的補丁、完成分區表頭校驗的配置文件
sec.dat Secure boot相關熔絲燒錄信息
adspso.bin ADSP動態加載程序圖像的分區
Cmnlib.mbn Verified boot feature introduced in M needLK to load cmnlib corresponding partitions

開機流程

Android系統是基於linux內核開發的,Android的開機首先就是用bootloader加載並啟動linux內核,當內核加載完成后就啟動Android系統,內核就會加載Android init進程進入Andriod系統並初始化相關參數和進程,並啟動Zygote進程,作為Android其他進程的父進程,Zygote進程做完初始化工作之后,啟動SystemServer來啟動其他系統服務。下面我們針對每個階段的執行作介紹。

引導程序和bootloader

當電源按下,引導程序開始從預定義位置(固化在ROM)開始執行PBL (Primary Boot Loader),從啟動設備(如eMMC)加載SBL1(Second BootLoader stage) segment1到L2。再加載SBL1 segment2到RPM處理器的RAM中。SBL1 segment1會初始化DDR,然后完成如下加載:

1) 從啟動設備加載QSEE/ TrustZone image到DDR

2) 從啟動設備加載DEVCFG image到DDR

3) 從啟動設備加載Debug Policy(調試相關)到DDR

4) 從啟動設備加載bootloader image到DDR

5) 從啟動設備加載RPMfirmware image到RPM的RAM中。

SBL1移交運行控制權給QSEE(高通安全執行環境)。QSEE建立安全運行環境,支持fuse。QSEE通知RPM啟動RPM 固件的執行。QSEE移交運行控制權給bootloader,bootloader加載、驗證kernel。

bootloader是在Android系統運行前的一個小程序,因此引導程序並不是Android系統的一部分。而是與主板芯片有關,是廠商加鎖限制的地方。它主要是由固化代碼程序和BootLoader程序組成,其中固化程序已經燒入到了生產的芯片中,而BootLoader程序通過它的啟動模式去引導系統CPU和部分外設的初始化。

啟動內核

BootLoader程序執行完后,標志着CPU和部分外設初始化完成,這時候就開始加載啟動內核了。內核的啟動和加載是一個很復雜的流程。在此只是簡單的說明下,大致可以分為三個階段:

1)內核自解壓引導程序bootloader完成后會跳轉運行內核程序,第一步就是檢測內核是否解壓,並將內核放於指定位置

2)設置CPU的工作模式,使能MMU(虛擬內存),設置一級頁表(內存相關)等

3)內核初始化,作是完成剩余與硬件平台相關的初始化工作,在進行一系列與內核相關的初始化之后,調用第一個用戶進程init並等待其執行。

簡單地說內核的啟動,就是初始化各種軟硬件環境,加載modemimage和驅動程序,掛載根文件系統,並找到init文件,啟動第一個進程任務。

init進程

init是整個系統的第一個進程,init進程的運行標志着正式進入了Android系統。 Init進程主要有三個核心工作:

1)創建和掛載一些系統目錄以及設備節點,並且設置權限(system.img是掛載到 / 下的鏡像,它包含了全部的系統可執行文件。

userdata.img掛載到 /data 下的鏡像,它包含了應用及用戶相關的數據。)

2)啟動屬性服務,和一系列相關的進程和Android服務

3)顯示boot logo,默認是“Android”顯示在屏幕上

Android服務啟動流程

Android啟動最重要的就是第二個核心工作:各個系統服務的啟動,因為Andriod的所有功能都是依賴這些系統服務完成的,如音樂視頻播放,撥打電話,使用wifi等等。這些服務統分為兩大類一個是本地服務,另一個是Android服務。下面介紹一下服務流程的啟動。

上文提到Android系統的init進程,init進程通過init.rc啟動腳本語言的執行,本地服務和Andriod服務,本地服務是指運行在C++層的系統守護進程,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。還有一部分本地服務,是由這些本地服務進一步創建的,如mediaserver服務會啟動AudioFlinger, MediaPlayerService, 以及 CameraService 等本地服務。

Android服務是指運行在虛擬機進程中的服務,這些服務的創建過程描述如下:init進程會執行app_process程序,創建Zygote進程,它是Android系統最重要的進程,所有后續的Android應用程序都是由它產生的。Zygote進程會首先分出(fork)"SystemServer"進程,"SystemServer"進程的全部任務就是將所有的Android核心服務啟動起來。

核心服務:

  • 啟動電源管理器;
  • 創建Activity管理器;
  • 啟動電話注冊;
  • 啟動包管理器;
  • 設置Activity管理服務為系統進程;
  • 啟動上下文管理器;
  • 啟動系統Context Providers;
  • 啟動電池服務;
  • 啟動定時管理器;
  • 啟動傳感服務;
  • 啟動窗口管理器;
  • 啟動藍牙服務;
  • 啟動掛載服務。

其他服務:

  • 啟動狀態欄服務;
  • 啟動硬件服務;
  • 啟動網絡狀態服務;
  • 啟動網絡連接服務;
  • 啟動通知管理器;
  • 啟動設備存儲監視服務;
  • 啟動定位管理器;
  • 啟動搜索服務;
  • 啟動剪切板服務;
  • 啟動登記服務;
  • 啟動壁紙服務;
  • 啟動音頻服務;
  • 啟動耳機監聽;
  • 啟動AdbSettingsObserver(處理adb命令)

一旦系統服務在內存中跑起來了,Android就完成了引導過程,進入安卓界面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM