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