文档章节

鸟人的Android揭秘(9)——Init进程运行过程

 鸟人部落
发布于 2016/12/25 22:18
字数 932
阅读 32
收藏 0

      众所周知,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

 

© 著作权归作者所有

粉丝 1
博文 14
码字总数 16642
作品 0
海淀
私信 提问
鸟人的Android揭秘(2)——通过启动过程分析 Android Framework

Android源代码数量极其庞大,以最新的 Android 7.1 为例,代码数量超过 50G。若想理解和掌握如此庞大的 Android 系统,将需要耗费大量的时间和精力,付出极大的努力。关键是到目前为止也没有...

鸟人部落
2016/12/12
32
0
[RK3288][Android6.0] 调试笔记 --- 增加操作系统开机时间

Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: 由于系统有模块需要和外部硬件做同步,因此要延长开机时间。 调试思路: 由于系统只显示了开机动画,没有开机Logo。因此一开始的思...

kris_fei
2018/04/17
0
0
Android 进程和线程模型

Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。 在 Linux 中,一...

长平狐
2013/01/06
113
0
Android启动过程深入解析

1.当按下Android设备电源键时究竟发生了什么? 2.Android的启动过程是怎么样的? 3.什么是Linux内核? 4.桌面系统linux内核与Android系统linux内核有什么区别? 5.什么是引导装载程序? 6.什...

AlexMahoneFBI
2015/11/16
88
0
Android的进程,线程模型

Android进程模型: 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。 在Linux中,一...

Jerikc
2013/03/12
331
0

没有更多内容

加载失败,请刷新页面

加载更多

个人服务容器化和监控集成

1.前景 自己比较喜欢玩机器,目前手上有4台常用的机器 asw 1核1G 阿里云 1核2G 腾讯云 1核1G 百度云 2核4G

MrPei
8分钟前
2
0
Rancher源码编译

源码包准备 mkdir -p $GOPATH/src/github.com/ranchercd $GOPATH/src/github.com/ranchergit clone https://github.com/rancher/rancher.gitcd ranchergit checkout v2.2.3-rc9 注1......

深蓝苹果
12分钟前
3
0
7个理由,给你推荐这款“秒杀Excel”的分析神器!

谈到数据分析,自然离不开赖以使用的数据分析工具。 商业智能时代,可用于数据分析的工具有很多,Python、R......还有各式各样的专业工具。其中,Excel也是推荐的比较多的一种,尤其是刚入门...

朕想上头条
25分钟前
2
0
Spring5 源码分析-容器刷新-解析配置类-主流程

上一篇:Spring5 源码分析-容器刷新-invokeBeanFactoryPostProcessors()方法 此篇是上一篇方法中非常非常重要的功能,也是Spring核心功能,完成所有的BeanDefinition注册。 详细的主流程,如...

特拉仔
27分钟前
2
0
Python 3.8.0 正式发布 更新内容

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的...

阮鹏
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部