我是靠谱客的博主 义气老鼠,最近开发中收集的这篇文章主要介绍鸟人的Android揭秘(9)——Init进程运行过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

      众所周知,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进程即真正运行起来,以下代码是内核内部实现的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进程文件位于系统最顶层目录中,如下图所示。

Android根文件系统

      当文件系统的根目录中不存在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目录下,kernel源代码的下载参考:http://source.android.com/source/building-kernels.html。

 

转载于:https://my.oschina.net/u/660323/blog/811713

最后

以上就是义气老鼠为你收集整理的鸟人的Android揭秘(9)——Init进程运行过程的全部内容,希望文章能够帮你解决鸟人的Android揭秘(9)——Init进程运行过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部