Android系統啓動1————概述和Liunx內核的啓動

Android系統啓動1————概述和Linux內核的啓動

一.概述

1.系統啓動的整體流程

Android啓動大致分爲兩個階段

  1. Linux的啓動
  2. 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 卷一》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章