Android 10.0系統啟動之init程序(二)-「Android取經之路」

感謝您的閱讀與點贊!歡迎點選右上角關注:「大貓玩程式」

上一節主要講了Init程序的整體架構,以及Kernel啟動的部分內容。

Android系統啟動之init程序(一)-「Android取經之路」

本節主要講解Android第一階段啟動的相關內容。第一階段主要有以下內容:

ueventd/watchdogd跳轉及環境變數設定

掛載檔案系統並建立目錄

初始化日誌輸出、掛載分割槽裝置

啟用SELinux安全策略

開始第二階段前的準備

4。 Init 程序啟動原始碼分析

我們主要是分析Android Q(10。0) 的init的程式碼。 涉及原始碼檔案:

platform/system/core/init/main。cppplatform/system/core/init/init。cppplatform/system/core/init/ueventd。cppplatform/system/core/init/selinux。cppplatform/system/core/init/subcontext。cppplatform/system/core/base/logging。cppplatform/system/core/init/first_stage_init。cppplatform/system/core/init/first_stage_main。cppplatform/system/core/init/first_stage_mount。cppplatform/system/core/init/keyutils。hplatform/system/core/init/property_service。cppplatform/external/selinux/libselinux/src/label。cplatform/system/core/init/signal_handler。cppplatform/system/core/init/service。cpp

4.1 Init 程序入口

前面已經透過kernel_init,啟動了init程序,init程序屬於一個守護程序,準確的說,它是Linux系統中使用者控制的第一個程序,它的程序號為1。它的生命週期貫穿整個Linux核心執行的始終。Android中所有其它的程序共同的鼻祖均為init程序。

可以透過"adb shell ps |grep init" 的命令來檢視init的程序號

。 Android Q(10。0) 的init入口函式由原先的init。cpp 調整到了main。cpp,把各個階段的操作分離開來,使程式碼更加簡潔命令,接下來我們就從main函式開始學習。

Android 10.0系統啟動之init程序(二)-「Android取經之路」

4.2 ueventd_main

程式碼路徑:platform/system/core/init/ueventd。cpp

Android根檔案系統的映象中不存在“/dev”目錄,該目錄是init程序啟動後動態建立的。 因此,建立Android中裝置節點檔案的重任,也落在了init程序身上。為此,init程序建立子程序ueventd,並將建立裝置節點檔案的工作託付給ueventd。 ueventd透過兩種方式建立裝置節點檔案。

第一種方式對應“冷插拔”(Cold Plug),即以預先定義的裝置資訊為基礎,當ueventd啟動後,統一建立裝置節點檔案。這一類裝置節點檔案也被稱為靜態節點檔案。 第二種方式對應“熱插拔”(Hot Plug),即在系統執行中,當有裝置插入USB埠時,ueventd就會接收到這一事件,為插入的裝置動態建立裝置節點檔案。這一類裝置節點檔案也被稱為動態節點檔案。

Android 10.0系統啟動之init程序(二)-「Android取經之路」

4.3 init 程序啟動第一階段

程式碼路徑:platform\system\core\init\first_stage_init。cpp

init程序第一階段做的主要工作是掛載分割槽,建立裝置節點和一些關鍵目錄,初始化日誌輸出系統,啟用SELinux安全策略 第一階段完成以下內容: /* 01。 建立檔案系統目錄並掛載相關的檔案系統 */ /* 02。 遮蔽標準的輸入輸出/初始化核心log系統 */

4。3。1 FirstStageMain

Android 10.0系統啟動之init程序(二)-「Android取經之路」

Android 10.0系統啟動之init程序(二)-「Android取經之路」

4.4 載入SELinux規則

SELinux是「Security-Enhanced Linux」的簡稱,是美國國家安全域性「NSA=The National Security Agency」和SCC(Secure Computing Corporation)開發的 Linux的一個擴張強制訪問控制安全模組。 在這種訪問控制體系的限制下,程序只能訪問那些在他的任務中所需要檔案。

selinux有兩種工作模式: permissive,所有的操作都被允許(即沒有MAC),但是如果違反許可權的話,會記錄日誌,一般eng模式用 enforcing,所有操作都會進行許可權檢查。一般user和user-debug模式用 不管是security_setenforce還是security_getenforce都是去操作/sys/fs/selinux/enforce 檔案, 0表示permissive 1表示enforcing

4.4.1 SetupSelinux

作用:初始化selinux,載入SELinux規則,配置SELinux相關log輸出,並啟動第二階段程式碼路徑: platform\system\core\init\selinux。cpp

Android 10.0系統啟動之init程序(二)-「Android取經之路」

4.4.2 SelinuxInitialize()

Android 10.0系統啟動之init程序(二)-「Android取經之路」

下一節主要講解init啟動的第二階段,歡迎關注我

VX公眾號:大貓玩程式

Android 10.0系統啟動之init程序(二)-「Android取經之路」