Android系統啓動1————概述和Linux內核的啓動
文章目錄
一.概述
1.系統啓動的整體流程
Android啓動大致分爲兩個階段
- Linux的啓動
- Android的啓動
其中Android啓動又可以分爲下面的步驟
- init進程的啓動
- zygote進程的啓動
- system Service進程的啓動
- 最後Launcher啓動Home Activity
大致過程如下圖所示:
其中1,2,3是linux啓動過程,4,5,6是android啓動過程。
2.init進程簡介
init進程是Android系統中用戶空間的第一個進程,作爲第一個進程,它被賦予了很多極其重要的工作職責,比如創建zygote(孵化器)和屬性服務等。init進程是由多個源文件共同組成的,這些文件位於源碼目錄system/core/init。
也就是說,init進程負責兩件事
- 負責創建系統中比較關鍵的進程,比如說zygote進程
- Andorid系統中有很多屬性,於是init進程就提供了一個property Service(屬性服務)來管理他們
3.Zygote進程簡介
在Android中,虛擬機,應用程序進程以及運行系統的關鍵服務的SystemServer進程都是由Zygote進程來創建的,我們也將它稱爲孵化器。它通過fock(複製進程)的形式來創建應用程序進程和SystemServer進程,由於Zygote進程在啓動時會創建DVM,因此通過fock而創建的應用程序進程和SystemServer進程可以在內部獲取一個DVM的實例拷貝。
也就是說,Zygote進程主要負責下面三件事
- 啓動虛擬機
- 創建SystemServer進程
- 創建應用進程
4.SystemServer進程簡介
SystemServer的進程名實際上叫做“system_server”,通常簡稱爲SS。
系統中的服務駐留在其中,常見的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,這些系統服務都是以一個線程的方式存在於SystemServer進程中。
也就是說,在SystemServer中,主要負責各種服務的創建。
二.Linux的啓動
Linux啓動分爲下面三大步驟
1.啓動電源
按開機鍵的時候,引導芯片開始從固化在ROM的預設代碼開始執行,然後加載引導程序到RAM。
2.引導程序BootLoader
引導程序BootLoader又稱爲引導程序,它是在操作系統運行之前的一段程序,是第一個程序,主要有檢查RAM,初始化硬件參數等功能,當然他的最終目的值把操作系統給他氣了。
文件目錄:/bootable/bootloader/legacy/
BootLoader功能如下:
stage1:
- 硬件設備初始化。爲stager2的執行及隨後的內核執行做好基本的硬件環境
- 爲加載stage2準備RAM空間,爲獲得更好的執行速度,通常把stage2加載到RAM中執行
- 複製stage2的代碼到ram中
- 設置好堆棧
- 跳轉到stage2的c程序入口
stage2:
- 初始化本階段要使用的硬件設備
- 檢查系統內存映射
- 將內存映像和根文件映像從flash讀到RAM中
- 爲內核設置啓動參數
- 調用內核
簡單的說,Bootloader負責初始化軟件運行所需要的最小硬件環境,最後加載內核到內存。
3.Linux內核的啓動
當內核啓動後,進入c語言編寫的代碼中,其入口函數爲start_kernel 函數完成了內核的大部分初始化工作。比如設置緩存,被保護存儲器,計劃列表,加載驅動。
實際上,可以將start_kernel 函數看做內核的main函數。start_kernel函數執行到最後調用了reset_init函數進行後續的初始化。 reset_init函數最主要的任務就是啓動內核線程kernel_init。
4.Kernel啓動init進程
kernel_init函數將完成設備驅動程序的初始化,並調用init_post函數啓動用戶空間的init進程。到init_post函數爲止,內核的初始化已經基本完成。
5.小結
總的來說,當我們按下啓動鍵,系統會去加載引導程序,引導程序拉起Linux內核,在Linux內核加載完成後,會通過Kernel啓動init進程。
下篇文章裏,我們會分析一下init進程的相關內容
在這之前,先了解一下Android初始化語言(Android Init Language)
三.Android初始化語言
1.概述
在Android初始化語言包含了4種類型的聲明,Actions(行動),Commands(命令)、Services(服務)和Options(選項)。
所以這些都是以行爲單位,各種記號由空格隔開。反斜槓可用於在記號間插入空格,雙引號也可以用於防止字符串被空格分隔成多個記號。行末的反斜槓用於折行。
註釋行以井號(#)開頭(允許以空格開頭)。
Actions和Services聲明一個新的分組。所有的命令或選項都屬於最近申明的分組。位於第一個分組之前的命令或選項將會被忽略。
Actions和Services有唯一的名字。如果有重名的情況,第二個申明的將會被作爲錯誤忽略。
2.Actions(行動)
Actions其實就是一序列的Commands(命令)。Actions都有一個trigger(觸發器),它被用於決定action的執行時間。當一個符合action觸發條件的事件發生時,action會被加入到執行隊列的末尾,除非它已經在隊列裏了。
隊列中的每一個action都被依次提取出,而這個action中的每個command(命令)都將被依次執行。Init在這些命令的執行期間還控制着其他的活動(設備節點的創建和註銷、屬性的設置、進程的重啓)。
Actions的形式如下:
on
3.Services(服務)
Services(服務)是一個程序,他在初始化時啓動,並在退出時重啓(可選)。Services(服務)的形式如下:
service [ ]*
service [ ]* //<service的名字><執行程序路徑><傳遞參數>
//option是service的修飾詞,影響什麼時候、如何啓動services
4.其他
關於其他更詳細的內容
可以參考官網文檔中的內容。
五.參考資料
《Android高級進階》
《深入理解android 卷一》