【android 7.1.2】系統啟動

大五千發表於2020-12-01

啟動概述

第一步:系統引導bootloader,即xxx_aboot.bin檔案

加電後,CPU將先執行 bootloader程式,然後bootloader首先會讀暫存器地址base + APP_DATA1的內容, 根據這個地址的值決定是否進入recovery模式或者其它模式。bootloader還會讀取MISC分割槽第一塊的內容, 決定進入recovery模式還是升級基帶Baseband Processor(BP)或做其它事情
而上述暫存器與分割槽的值是有按鍵觸發或者軟體觸發的。

  • 開機按reset+返回鍵,系統進入recovery模式,載入recovery.img,recovery.img包含核心,基本的檔案系統,用於工程模式的燒寫
  • 開機按Power,正常啟動系統,載入boot.img,boot.img包含核心,基本檔案系統,用於正常啟動機器(以下只分析正常啟動的情況)

第二步: 啟動核心kernel

  • 原始碼:kernel/*
  • 說明:kernel由bootloader載入
  • 描述:核心啟動時,設定快取、被保護儲存器、計劃列表,載入驅動。當核心完成系統設定,它首先在系統檔案中尋找”init”檔案,然後啟動root程式或者系統的第一個程式。

第三步: 檔案系統(rootfs)及應用初始化(init)

  • 原始碼:system/core/init/*
  • 配置檔案:system/rootdir/init.rc,
  • 說明:init是一個由核心啟動的使用者級程式,它按照init.rc中的設定執行:啟動服務(這裡的服務指linux底層服務,如adbd提供adb支援,vold提供SD卡掛載等),執行命令和按其中的配置語句執行相應功能

第四步: 重要的後臺程式zygote

  • 原始碼:frameworks/base/cmds/app_main.cpp等
  • 說明:zygote是一個在init.rc中被指定啟動的服務,該服務對應的命令是/system/bin/app_process
    a) 建立Java Runtime,建立虛擬機器
    b) 建立Socket接收ActivityManangerService的請求,用於Fork應用程式
    c) 啟動SystemServer

第五步: 系統服務system server

  1. 原始碼:frameworks/base/services/java/com/android/server/SystemServer.java
  2. 說明:被zygote啟動,通過System Manager管理android的服務(這裡的服務指frameworks/base/services下的服務,如衛星定位服務,剪下板服務等)

第六步:桌面launcher

  1. 原始碼:ActivityManagerService.java為入口,packages/apps/launcher*實現

詳細的程式碼可以參考基於android7.1分析android啟動過程
後續補充程式碼view

相關文章