標籤:
init進程,其程式位於根檔案系統中,在kernle自行啟動後,其中的 start_kernel 函數把根檔案系統掛載到/目錄後,在 rest_init 函數中通過 kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); 建立PID為1的核心進程,隨後調用 run_init_process 來載入boot分區中根檔案系統裡的init程式來跳轉到使用者空間運行。init是第一個運行在使用者空間的進程。之後很多的系統服務都由init進程fork而來,主要的有servicemanager,zygote。zygote又會fork其他進程,主要有systerserver,launcher等apk。systermserver則會以多線程的方式啟動其他系統服務,比如PowerManagerService等。
init進程的主要作用如下
- 建立臨時檔案系統目錄並掛載相依檔案系統
- 管理裝置(通過裝置檔案節點)
- 初始化屬性系統,其類似於Windows系統的註冊表
- 讀取bootloader傳給kernel的cmdline,並存入相應的ro屬性中
- 設定SELinux相關策略
- 解析rc檔案,執行相應動作,包括啟動相依服務
- 之後進入迴圈過程,有五個動作
- 執行action列表中的表頭命令
- 檢測系統中是否有進程需要被重啟
- 監聽屬性系統,處理修改屬性的事件
- 監聽chordered keyboard的按鍵輸入事件,其可以啟動相依的service,目前不支援
- 回收殭屍進程
另外,/sbin目錄下ueventd和watchdog程式為/init程式的軟連結,因為三者有許多東西類似,所以為了方便共用代碼減小體積,類似於busybox/toolbox,通過傳遞過來的argv參數,來決定跑init,ueventd,watchdog中的哪一個。
ueventd守護進程負責監聽熱插拔事件,類似於udev。
watchdogd守護進程負責定時向 "/dev/watchdog" 裝置寫1踢狗。
以上即為Android使用者空間,第一個啟動並執行使用者進程所做的事情,所提供的服務以及所監聽的事件。
Android init進程概述