Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android揭秘(9)——Init進程運行過程

Android揭秘(9)——Init進程運行過程

編輯:關於Android編程

眾所周知,Linux中所有進程都是由init進程創建並運行起來的。首先Linux加載內核啟動,然後在用戶空間中啟動init進程,之後init進程再依次啟動系統運行的其它進程。在系統啟動完成後,init進程會作為守護進程監視其它進程。若某個監視中的進程終結,進入僵死狀態時,init進程就會釋放進程所占用的系統資源。

在Android平台(以下稱Android)中也存在init進程,除了提供以上常見的功能外,還提供幾種額外的功能。

在本章中,將討論學習Android的init進程的功能,需要讀者具有一定的Linux系統系統編程知識,如果您對Linux編程知識感到陌生,建議事先翻閱相關的書籍進行學習。

與Linux類似,Android內核啟動後,也會在用戶空間啟動init進程,作為第一個用戶級進程。

\

由上圖內核啟動過程可以看出,Android內核在啟動過程中,依次執行start_kernel()函數、rest_init()函數、kernel_init()函數和run_init_process()函數後,最後啟動init進程。在rest_init()函數中即會創建出一個新進程用於運行init進程,以保證init進程是第一個用戶級進程,其pid為1,在run_init_process()函數執行後,init進程即真正運行起來,代碼3-1是內核內部實現的init進程啟動代碼。

static int __ref kernel_init(void *unused)
{
 ...
 if (execute_command) { ①
 ret = run_init_process(execute_command);
 if (!ret)
 return 0;
 panic("Requested init %s failed (error %d).",
  execute_command, ret);
 }
 if (!try_to_run_init_process("/sbin/init") ||
  !try_to_run_init_process("/etc/init") ||
  !try_to_run_init_process("/bin/init") ||
  !try_to_run_init_process("/bin/sh"))
 return 0;
 panic("No working init found. Try passing init= option to kernel. "
  "See Linux Documentation/init.txt for guidance.");
}

 

① kernerl_init()函數獲取注冊在execute_command中的進程文件路徑,調用run_init_process()函數,執行do_execve()系統調用。do_execve()函數執行由參數傳遞過來的路徑下的進程文件。注意,在設置內核啟動選項時,應設置“init=/init”,以便正常運行init進程,因為在編譯完Android後生成的根文件系統中,init進程文件位於系統最頂層目錄中,如下圖所示。

\

當文件系統的根目錄中不存在init進程文件,或未指定啟動選項“init=”時,內核會到/sbin、/etc、/bin目錄下查找init文件。如果在這些目錄仍未找到init文件,內核會引發Kernel Panic錯誤,終止執行init進程。

若上述kernel_init函數的代碼執行成功,則init進程就正常啟動。Android是個開源系統,代碼都可以下載下來進一步查看,從而更好地把握某些進程的具體動作。從下一節開始,我們將一起分析init進程的源代碼[2],了解Android啟動過程中,init進程都做了哪些事情。

[1]此函數定義在kernel代碼的init/main.c中。

[2]該代碼在kernel源代碼的init目錄下

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved