Android 系統開發】 Android 系統啟動流程簡介

      網友投稿 1078 2022-05-29

      轉載請注明出處 :?http://blog.csdn.net/shulianghan/article/details/38895481

      Android 系統啟動總結 : Android 系統啟動分底層 Linux 內核啟動 和 應用系統啟動;

      -- 底層系統啟動 : 系統上電, bootloader 啟動, linux kernel 啟動, init 進程啟動;

      -- 應用系統啟動 : init 進程啟動關鍵的進程如 Zygote 進程 和 System Server 等系統服務, 之后進入 Home 界面;

      一. Android 底層系統啟動流程(Bootloader Kernel init)

      1. 系統上電 執行 ROM 引導代碼

      (1) Android 系統執行的操作

      Android 底層上電流程 : CPU 上電 --> PC 指向 ROM 啟動代碼零地址 --> 直接執行啟動代碼 / 將啟動代碼載入 RAM 后執行

      -- CPU 上電 : 首先 Android 系統的 CPU 上電復位;

      -- 程序指針指向?: 復位時 PC 指針指向 ROM 的零地址, 即 Android 系統的啟動代碼的地址;

      -- 直接執行代碼 : 從 零地址 讀取可執行代碼直接運行;

      -- 轉載代碼到RAM再執行 : 將執行代碼載入到 CPU 的 RAM 中執行;

      啟動代碼介紹 :?啟動代碼?固化在 ROM 中, CPU 復位上電后, PC 指向 ROM 中代碼的初始地址 即 零地址, 并執行該代碼;

      (2) PC 啟動與 Android 啟動比較

      PC 啟動系統機制 : ROM 分類 和 BIOS 作用 (初始化硬件設備, 載入硬盤運行);

      -- 啟動 ROM 分類 : 包括 PROM, EPROM, EEPROM三種;

      -- ROM 中的啟動程序 BIOS : BIOS 是 PC 的啟動代碼, 其作用是初始化硬件設備, BIOS 被載入到硬盤的扇區 MBR 之后運行并開始引導操作系統;

      Android 系統機制 : ROM 分類 和 Bootloader 啟動程序;

      -- 啟動 ROM 分類 : Android 中的 啟動 ROM 分為 NOR Flash 和 NAND Flash 兩種;

      -- ROM 中的啟動程序 Bootloader : Bootloader 地址是 CPU 復位后指向的地址, 即零地址;

      (3) Bootloader 啟動方式簡介

      Bootloader 啟動位置 : Bootloader 在 ROM 中直接啟動 還是 裝載到 RAM 中啟動取決與 ROM 是否可以按字節尋址;

      -- 按字節尋址的 ROM : NOR Flash 可以按字節尋址, Bootloader 可以直接在 ROM 中執行;

      -- 不可字節尋址 ROM : NAND Flash 不支持按字節尋址, Bootloader 需要先載入到 CPU 的 RAM 中, 然后在執行;

      (4) NOR Flash 啟動過程

      啟動方式總結 : 直接執行 Bootloader -> 寫寄存器 -> 配置模塊 -> 復制代碼到內存中 -> PC 指向零地址 -> 地址映射 -> 執行映射的啟動代碼;

      注意 : 這種情況是將 Bootloader 燒寫入 NOR Flash 中的情況, 與現在最新的 CPU 內置 ROM 方式不同;

      NOR Flash 啟動過程 : 這種 ROM 支持字節尋址, 固化在其中的啟動代碼(Bootloader)可以按照順序執行;

      -- 開始啟動 : Bootloader 存放在 NOR Flash 零地址, CPU 復位后 PC 指向零地址, 開始執行 Bootloader;

      -- 寫寄存器 : 配置 EMI 寄存器, 該寄存器存儲設置好的各存儲器地址 和 存取規則;

      -- 模塊配置 : 配置電源管理模塊, 使各個模塊上電;

      -- 復制代碼 : 為了提高執行效率, 將 NOR Flash 中的代碼復制到內存中;

      -- PC指針 : PC 指針指向 NOR Flash 零地址, 開始執行啟動代碼;

      -- 地址映射 : 啟動代碼執行后, 會將啟動代碼所在的 零地址 映射到 內存 RAM 空間;

      -- RAM執行 : PC 指針指向 RAM 中映射的地址, 開始執行啟動代碼;

      (5) NAND Flash 啟動過程

      注意 : 這種情況是將 Bootloader 燒寫入 NAND Flash 中啟動代碼執行流程;

      NAND Flash 啟動過程 :

      -- 搬運代碼到內部 RAM : CPU 上電復位之后, DMA 將 NAND Flash 中的 Bootloader 啟動代碼搬運到 CPU 內部的 RAM 中, 設置 PC 到 RAM 代碼地址, 開始執行 Bootloader;

      -- 設置配置 向量 : Bootloader 會執行 設置中斷向量, 設置硬件配置 操作;

      -- 搬運代碼到外部 RAM : 計算出 Bootloader 所占大小, 預留出 Bootloader 空間大小, 將執行代碼搬運到 SDRAM 或 DD-RAM 外部 RAM 中;

      -- 搬運 Bootloader : 將 Bootloader 代碼搬運到 SDRAM 或 DDR-RAM 中的首地址;

      -- 地址映射 : 設置 Remap, 映射 0 地址到 SDRAM 或者 DDR-RAM 首地址;

      -- 執行Bootloader : 設置 PC 指針到 零地址, 執行 Bootloader;

      (6) Bootloader 燒錄工藝

      MASK 燒錄 : 早期的?ROM PROM 通過 MASK 植入啟動代碼;

      燒錄器 : EPROM EEPROM 通過燒錄器燒入啟動代碼, 之后貼片焊接;

      JTAG 調試器 : NOR Flash 和 NAND Flash 通過 JTAG 調試器連接 CPU 的 JTAG 調試接口 和 PC 機, 將編譯好的 Bootloader 燒入 NOR Flash 和 NAND Flash 指定地址;

      CPU 內置 ROM :

      -- 固化代碼 : CPU 再內置的 ROM 中固化一段代碼, 這段代碼不是 Bootloader;

      -- 代碼作用 : 這段代碼啟動后可以與 PC 連接, 直接使用網絡接口 或 USB 接口便可以連接 PC, 不再依賴 JTAG 調試器燒錄, 速度和效率也提高了;

      2. Bootloader 引導程序簡介

      (1) Bootloader 作用

      Bootloader 作用 : 初始化硬件設備, 建立內存空間映射圖, 為內核啟動準備好軟件, 硬件環境;

      -- 類似 BIOS : Bootloader 本質與 PC 上的 BIOS 相同, 都是為 操作系統 初始化 軟件, 硬件環境;

      (2) Bootloader 加密

      【Android 系統開發】 Android 系統啟動流程簡介

      加密簡介 :

      -- 加鎖原因 : 手機廠商為了實現 系統價值, 穩定運行, 用戶信息安全 等功能, 會對 Bootloader 進行加鎖;

      -- 加鎖局限 : Bootloader 加鎖后只能引導指定手機廠商的 硬件, 內核, 和操作系統, 不能識別其他廠商硬件;

      -- 解鎖隱患 : Bootloader 一旦解鎖, 對用戶來說 : 存在潛在的穩定性 與 系統安全問題; 對廠商來說 : 手機可以隨意刷寫 淪為硬件平臺;

      3. Linux 內核

      (1) Linux 內核鏡像

      Linux 內核鏡像 : Linux 內核有兩種鏡像 Image 和 zImage;

      -- Image (非壓縮內核) : 沒有經過壓縮的內核鏡像, 占用空間大, 執行速度快;

      -- zImage (壓縮內核) : Image 經過壓縮后的內核鏡像, 占用空間小, 但是執行的時候需要解壓縮, 執行效率慢;

      -- 嵌入式選擇 : 嵌入式系統中空間比較小, 通常采用 zImage 壓縮鏡像, 犧牲一點執行效率換取較少的存儲空間;

      (2) 內核啟動流程

      Kernel 啟動流程 : 內核初始化 -> 設備驅動初始化 -> 內核啟動 -> 掛載文件系統 -> 啟動用戶空間進程;

      (3) 內核初始化

      內核初始化 : 主要對硬件進行配置;

      -- 向量表 : 創建異常向量表 和 初始化中斷處理函數;

      -- 進程調度器 : 初始化系統核心進程調度器 和 時鐘中斷處理機制;

      -- 串口 : 初始化串口控制臺;

      -- 緩存 : 創建和初始化系統, 為內存調用提供緩存;

      -- 內存管理 : 初始化內存管理, 檢測內存大小及碑內核占用的內存情況;

      -- 進程通信 : 初始化系統進程通信機制;

      (4) 設備初始化

      設備初始化 : 加載設備驅動, 主要有 靜態加載 和 動態加載兩種方式;

      -- 靜態加載 : 將驅動模塊加載到內核中, 設備驅動會在內核啟動的時候自動加載, 這種驅動是無法卸載的;

      -- 動態加載 : 在系統中使用 modprobe 或者 insmod 進行設備驅動模塊的加載, 使用 rmmod 進行設備驅動模塊卸載;

      (5) 掛載文件系統

      掛載文件系統 :

      -- 創建并掛載根設備 :?kernel 初始化 和 設備初始化之后會創建 根設備, 根設備文件系統以只讀方式掛載;

      -- 釋放內存到根設備 : 根設備創建成功之后, 根設備是只讀的, 這時釋放未使用的內存到 根設備上;

      (6) 啟動 init 程序

      啟動應用程序 :?根文件掛載成功后, 啟動 /sbin/init 程序, 這是 linux 系統第一個應用程序, 啟動成功后 init 進程會獲得 linux 系統的控制權;

      -- 硬件初始化 : 初始化 Android 設備硬件;

      -- 掛載根文件 : 根據命令行參數掛載根文件系統;

      -- 跑啟動腳本 : 執行用戶自定義的 init 啟動腳本;

      4. init 初始化系統服務

      (1) init 初始化系統服務

      Linux 中 init 進程簡介 :

      -- 系統父進程 : init 進程是 Linux 系統所有進程的 父進程, id 為 1;

      -- init 進程作用 : 初始化 和 啟動 系統, 創建其它進程 如 shell login 等進程;

      Android 中 init 進程簡介 :

      -- 系統父進程 : init 在 Android 中也是第一個進程, id 為 1;

      -- 創建其它進程 : 創建 zygote 進程, 該進程可以提供 屬性服務 用于管理系統屬性;

      (2) init 完成操作

      init 操作 : 系統初始化操作, 解析 init.rc 配置文件等操作;

      -- 初始化 : 初始化 log 系統;

      -- 解析配置 : 解析 init.rc 配置文件 和 /init.硬件平臺名稱.rc 配置文件, 執行 early-init, 解析 init 動作, eartly-boot 動作, boot 動作, Execute property 動作;

      -- 初始化2 : 設備初始化, 屬性服務初始化, 開啟屬性服務;

      -- 無限循環 : 進入無限循環狀態, 等待屬性設置 或 子進程退出事件;

      (3) init.rc 配置文件解析

      init.rc 組成 : 該配置文件由 命令類, 動作類, 服務類, 選項類 聲明組成;

      -- 對應語法 : 命令, 動作, 觸發條件, 服務, 選項 和 屬性;

      命令示例 : init.rc 中的命令在 init 程序中解析, 之后調用相關函數實現;

      # Create cgroup mount point for memory mount tmpfs none /sys/fs/cgroup mode=0750,uid=0,gid=1000 mkdir /sys/fs/cgroup/memory 0750 root system mount cgroup none /sys/fs/cgroup/memory memory write /sys/fs/cgroup/memory/memory.move_charge_at_immigrate 1 chown root system /sys/fs/cgroup/memory/tasks chmod 0660 /sys/fs/cgroup/memory/tasks mkdir /sys/fs/cgroup/memory/sw 0750 root system write /sys/fs/cgroup/memory/sw/memory.swappiness 100 write /sys/fs/cgroup/memory/sw/memory.move_charge_at_immigrate 1 chown root system /sys/fs/cgroup/memory/sw/tasks chmod 0660 /sys/fs/cgroup/memory/sw/tasks

      on nonencrypted class_start late_start on charger class_start charger on property:vold.decrypt=trigger_reset_main class_reset main

      service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd

      屬性 示例 : 系統中設置的屬性值, 可設置 或者 讀寫;

      # Define TCP buffer sizes for various networks # ReadMin, ReadInitial, ReadMax, WriteMin, WriteInitial, WriteMax, setprop net.tcp.buffersize.default 4096,87380,110208,4096,16384,110208 setprop net.tcp.buffersize.wifi 524288,1048576,2097152,262144,524288,1048576 setprop net.tcp.buffersize.lte 524288,1048576,2097152,262144,524288,1048576 setprop net.tcp.buffersize.umts 4094,87380,110208,4096,16384,110208 setprop net.tcp.buffersize.hspa 4094,87380,262144,4096,16384,262144

      二. Android 上層系統啟動流程

      1. Android 上層系統啟動簡介

      啟動流程 : init 進程啟動 -> 啟動 Android 系統本地服務(Native Service) -> Zygote進程 -> Android 系統服務(System Service) -> HomeActivity 啟動;

      2. 啟動 Native Service (本地服務)

      Native Service 簡介 :

      -- 啟動進程 : 由 init 啟動, 是 C/C++ 實現的;

      -- 主要作用 : 本地服務 是 Android 內核 與 Android 應用?通信?的通道, 兩層之間通過 socket 進行通信;

      Native Service 提供的服務 : 其啟動項定義在 init.rc 中;

      -- Console : shell console 服務;

      -- Service Manager : Binder 服務管理器, 管理所有的 Android 系統服務;

      -- Vold : 支持外設熱插拔服務;

      -- Mountd : 設備安裝 狀態通知服務;

      -- Debuggerd : 處理調試進程請求服務;

      -- Rild : 無線接口層服務;

      -- Zygote : 啟動 Dalvik 并創建其它進程服務;

      -- MediaServer : 多媒體相關服務;

      3. Zygote 進程啟動

      Zygote 進程簡介 : Zygote 由 init 進程創建, init.rc 中配置了 Zygote 的創建參數;

      -- init.rc 中配置 : Zygote 原始名稱是 "app_process", 啟動中改名為 Zygote;

      service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

      Zygote 作用 :

      -- 本質 : Zygote 進程是一個虛擬的進程, 是虛擬實例(Dalvik虛擬機)的孵化器;

      -- 操作 : Zygote 負責 Dalvik 虛擬機初始化, 預置類庫加載等操作;

      -- 應用啟動處理 :?每個 Android 應用啟動時, Zygote 會創建一個子進程(Dalvik虛擬機)執行它;

      -- 節省內存策略 : Android 中有些系統庫是只讀的, 所有的 Dalvik 虛擬機都可以共享這些只讀系統庫;

      4. Android System Service 啟動

      Android 系統服務 :

      -- 啟動 : Android System Service 是 Zygote 進程的第一個子進程, 由 Zygote 進程孵化而來;

      -- 作用 : System Service 是 Android 框架核心, 負責 Android 系統初始化?并 啟動其它服務;

      -- 其它服務 : System Service 孵化的其它服務運行在對應 Dalvik 虛擬機進程的空間里;

      -- init.rc 配置 : 在 Zygote 配置中 "--start-system-server" 參數用來實現 System Service 的啟動;

      5. 啟動 HomeActivity 主界面

      Launcher 應用程序 : 該應用程序就是 HomeActivity 所在的程序;

      -- 啟動 : Launcher 由 Activity Manager Service 啟動, 啟動流程 System Service -> Activity Manager Service -> Launcher;

      -- 展示圖標 : Launcher 啟動后就會將已經安裝的 app 程序的快捷圖標展示到桌面;

      轉載請注明出處?:?http://blog.csdn.net/shulianghan/article/details/38895481

      Android ARM Linux

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:防火墻原理與定義
      下一篇:親身體驗!后端工程師學習路徑、書籍、視頻推薦
      相關文章
      亚洲毛片一级带毛片基地| 亚洲综合一区二区精品久久| 亚洲一区二区三区乱码在线欧洲| 亚洲视频在线视频| 亚洲国产高清在线| 久久久久无码精品亚洲日韩| 久久久久久亚洲av成人无码国产| 亚洲AV中文无码乱人伦下载| 亚洲成AV人片在线观看WWW| 国产AV无码专区亚洲AVJULIA| 亚洲国产一成人久久精品| 国产亚洲AV无码AV男人的天堂| 亚洲人成色77777| 日本亚洲视频在线| 亚洲av日韩av高潮潮喷无码 | 亚洲国产精品一区二区久久| 亚洲国产另类久久久精品小说| 亚洲精品国偷自产在线| 久久精品国产亚洲| 久久亚洲AV无码精品色午夜麻豆| 亚洲精品乱码久久久久久下载| 亚洲日韩在线视频| 性xxxx黑人与亚洲| 亚洲精品国产精品| 日韩精品电影一区亚洲| 日韩精品亚洲aⅴ在线影院| 亚洲高清国产拍精品26U| 亚洲天堂在线播放| 33333在线亚洲| 亚洲国产一区二区三区在线观看| 久久精品国产亚洲AV天海翼| 亚洲高清无码专区视频| 中文字幕亚洲无线码| 亚洲精品无码av人在线观看 | 久久亚洲精品中文字幕三区| 亚洲第一精品在线视频| 亚洲国产片在线观看| 亚洲欧美黑人猛交群| 亚洲成片观看四虎永久| 亚洲精品成人无码中文毛片不卡| 亚洲视频免费在线观看|