亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
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 加密
加密簡介 :
-- 加鎖原因 : 手機廠商為了實現 系統價值, 穩定運行, 用戶信息安全 等功能, 會對 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小時內刪除侵權內容。