鳥人的Android揭祕(9)——Init進程運行過程

      衆所周知,Linux中全部進程都是由init進程建立並運行起來的。首先Linux加載內核啓動,而後在用戶空間中啓動init進程,以後init進程再依次啓動系統運行的其它進程。在系統啓動完成後,init進程會做爲守護進程監視其它進程。若某個監視中的進程終結,進入僵死狀態時,init進程就會釋放進程所佔用的系統資源。html

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

      在本章中,將討論學習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進程即真正運行起來,如下代碼是內核內部實現的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進程文件位於系統最頂層目錄中,以下圖所示。ui

Android根文件系統

      當文件系統的根目錄中不存在init進程文件,或未指定啓動選項「init=」時,內核會到/sbin、/etc、/bin目錄下查找init文件。若是在這些目錄仍未找到init文件,內核會引起Kernel Panic錯誤,終止執行init進程。rest

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

 

 

 

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

[2] 該代碼在kernel源代碼的init目錄下,kernel源代碼的下載參考:http://source.android.com/source/building-kernels.html進程

相關文章
相關標籤/搜索