一、概述
init是Linux系統中使用者空間的第一個程序,程序号為1。Kernel啟動後,在使用者空間,啟動init程序,并調用init中的main()方法執行init程序的職責。對于init程序的功能分為4部分:
分析和運作所有的init.rc檔案;
生成裝置驅動節點; (通過rc檔案建立)
處理子程序的終止(signal方式);
提供屬性服務。
1. main方法
2. console_init_action
開機顯示的底部帶ANDROID字樣的畫面
二、信号處理
在init.cpp的main()方法中,通過signal_handler_init()來初始化信号處理過程。
主要工作:
初始化signal句柄;
循環處理子程序;
注冊epoll句柄;
處理子程序的終止;
1. signal_handler_init
每個程序在處理其他程序發送的signal信号時都需要先注冊,當程序的運作狀态改變或終止時會産生某種signal信号,init程序是所有使用者空間程序的父程序,當其子程序終止時産生SIGCHLD信号,init程序調用信号安裝函數sigaction(),傳遞參數給sigaction結構體,便完成信号處理的過程。
SIGCHLD_handler和handle_signal,如下:
三、rc檔案文法
rc檔案文法是以行尾機關,以空格間隔的文法,以#開始代表注釋行。rc檔案主要包含Action、Service、Command、Options,其中對于Action和Service的名稱都是唯一的,對于重複的命名視為無效。
1. Action
Action: 通過trigger,即以 on開頭的語句,決定何時執行相應的service。
2. Service
服務Service,以 service開頭,由init程序啟動,一般運作于另外一個init的子程序,是以啟動service前需要判斷對應的可執行檔案是否存在。init生成的子程序,定義在rc檔案,其中每一個service,在啟動時會通過fork方式生成子程序。
3.Command
class_start : 啟動屬于同一個class的所有服務;
start : 啟動指定的服務,若已啟動則跳過;
stop : 停止正在運作的服務
setprop :設定屬性值
mkdir :建立指定目錄
symlink : 建立連接配接到的符号連結;
write : 向檔案path中寫入字元串;
exec: fork并執行,會阻塞init程序直到程式完畢;
exprot :設定環境變量;
loglevel :設定log級别
四、啟動服務
1. 服務啟動(Zygote)
通過init_parser.cpp完成整個service解析工作,此處就不詳細展開講解析過程,該過程主要是建立一個名”zygote”的service結構體,一個socketinfo結構體(用于socket通信),以及一個包含6個onrestart的action和1個writepid的結構體。
Zygote服務會随着main class的啟動而啟動,退出後會由init重新開機zygote