總結(jié)一個(gè)圖:kernel 到android核心啟動(dòng)過(guò)程
kernel鏡像執(zhí)行跳轉(zhuǎn)到start_kernel開(kāi)始執(zhí)行,在rest_init會(huì)創(chuàng)建兩個(gè)kernel 進(jìn)程(線程),其分別是為kernel_init 與kthreadd,創(chuàng)建完后系統(tǒng)通過(guò)init_idle_bootup_task蛻化為idle進(jìn)程(cpu_idle)。
調(diào)用kernel_thread()創(chuàng)建1號(hào)內(nèi)核線程, 該線程隨后轉(zhuǎn)向用戶空間, 演變?yōu)閕nit進(jìn)程
調(diào)用kernel_thread()創(chuàng)建kthreadd內(nèi)核線程。
- init_idle_bootup_task():當(dāng)前0號(hào)進(jìn)程init_task最終會(huì)退化成idle進(jìn)程,所以這里調(diào)用init_idle_bootup_task()函數(shù),讓init_task進(jìn)程隸屬到idle調(diào)度類中。即選擇idle的調(diào)度相關(guān)函數(shù)。
- 調(diào)用cpu_idle(),0號(hào)線程進(jìn)入idle函數(shù)的循環(huán),在該循環(huán)中會(huì)周期性地檢查
- kernel_init 中會(huì)執(zhí)行/init(ramdisk_execute_command的值為"/init")
在這里插入圖片描述
/init 啟動(dòng)后執(zhí)行/system/core/init/main.cpp 中main 方法,這里執(zhí)行FirstStageMain()
(看看這到了哪里?這到了咱們的的AVB那個(gè)地方啊)
FirstStageMain()中通過(guò)execv 執(zhí)行/system/bin/init,參數(shù)為selinux_setup。這里init 跟/init 一樣,因此再次執(zhí)行init 鏡像。
這里如果是重啟到bootloader,會(huì)執(zhí)行InstallRebootSignalHandlers
SetupSelinux 中再次執(zhí)行init,這里會(huì)注冊(cè)信號(hào)處理函數(shù)
從而參數(shù)second_stage,執(zhí)行SecondStageMain ,在這里解析.rc ,啟動(dòng)ueventd,并等待其啟動(dòng)完成。
init 鏡像通過(guò)execv會(huì)執(zhí)行兩次,分別通過(guò)FirstStageMain和SecondStageMain執(zhí)行。
Zygote是Android系統(tǒng)創(chuàng)建新進(jìn)程的核心進(jìn)程 ,
- 負(fù)責(zé)啟動(dòng)Dalvik虛擬機(jī),
- 加載一些必要的系統(tǒng)資源和系統(tǒng)類,
- 啟動(dòng)system_server進(jìn)程,
- 隨后進(jìn)入等待處理app應(yīng)用請(qǐng)求。
到這里我們就暫時(shí)停下,別走遠(yuǎn)了。
芯片上電到Android
總結(jié)一下整個(gè)流程
- 第一步:手機(jī)開(kāi)機(jī)后,引導(dǎo)芯片啟動(dòng),引導(dǎo)芯片開(kāi)始從固化在ROM里的預(yù)設(shè)代碼執(zhí)行,加載引導(dǎo)程序到到RAM,bootloader檢查RAM,初始化硬件參數(shù)等功能;
- 第二步:硬件等參數(shù)初始化完成后,進(jìn)入到Kernel層,Kernel層主要加載一些硬件設(shè)備驅(qū)動(dòng),初始化進(jìn)程管理等操作。在Kernel中首先啟動(dòng)swapper進(jìn)程(pid=0),用于初始化進(jìn)程管理、內(nèi)管管理、加載Driver等操作,再啟動(dòng)kthread進(jìn)程(pid=2),這些linux系統(tǒng)的內(nèi)核進(jìn)程,kthread是所有內(nèi)核進(jìn)程的鼻祖;
- 第三步:Kernel層加載完畢后,硬件設(shè)備驅(qū)動(dòng)與HAL層進(jìn)行交互。初始化進(jìn)程管理等操作會(huì)啟動(dòng)INIT進(jìn)程 ,這些在Native層中;
- 第四步:init進(jìn)程(pid=1,init進(jìn)程是所有進(jìn)程的鼻祖,第一個(gè)啟動(dòng))啟動(dòng)后,會(huì)啟動(dòng)adbd,logd等用戶守護(hù)進(jìn)程,并且會(huì)啟動(dòng)servicemanager(binder服務(wù)管家)等重要服務(wù),同時(shí)孵化出zygote進(jìn)程,這里屬于C++ Framework,代碼為C++程序;
- 第五步:zygote進(jìn)程是由init進(jìn)程解析init.rc文件后fork生成,它會(huì)加載虛擬機(jī),啟動(dòng)System Server(zygote孵化的第一個(gè)進(jìn)程);System Server負(fù)責(zé)啟動(dòng)和管理整個(gè)Java Framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服務(wù);
- 第六步:zygote同時(shí)會(huì)啟動(dòng)相關(guān)的APP進(jìn)程,它啟動(dòng)的第一個(gè)APP進(jìn)程為L(zhǎng)auncher,然后啟動(dòng)Email,SMS等進(jìn)程,所有的APP進(jìn)程都由zygote fork生成。
那么到這里我們就把整個(gè)系統(tǒng)的啟動(dòng)串聯(lián)起來(lái)了從bootrom-bootloader-kernel。
當(dāng)然真實(shí)的系統(tǒng)為了安全,比如說(shuō) 基于TrustZone框架的啟動(dòng)流程 ,那肯定不止這些步驟,但是大體上也是穿插在這個(gè)流程之中的增刪改。
-
Android
+關(guān)注
關(guān)注
12文章
3937瀏覽量
127497 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1374瀏覽量
40311 -
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209738 -
Kernel
+關(guān)注
關(guān)注
0文章
48瀏覽量
11195
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論