众所周知,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进程文件位于系统最顶层目录中,如下图所示。

当文件系统的根目录中不存在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进程运行过程相关推荐

  1. Android系统启动系列----init进程

    Android系统启动系列 Android系统启动系列----init进程 Android系统启动系列----Zygote进程 引言 在开发app的过程中,是不是会有疑问: java程序的运行不是从m ...

  2. 从源码角度看Android系统init进程启动过程

    init进程是Linux系统中用户空间的第一个进程,进程号为1.Kernel启动后,在用户空间启动init进程,并调用/system/core/init.cpp中的main方法执行一些重要的工作. 备 ...

  3. Android程序暂停sh,init进程 解析Android启动脚本init.rc 修改它使不启动android init.rc中启动一个sh文件...

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径: system/core/init,编 ...

  4. Android启动的init进程

    /system/core/init/- init.cpp- init_parser.cpp- signal_handler.cpp 一.概述 init是Linux系统中用户空间的第一个进程,进程号为1 ...

  5. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  6. 鸟人的Android揭秘(4)——Android 源代码编译

    前文主要讲解了 Android 编译环境的搭建,接下来我们正式开始 Android 源代码的编译,主要涉及两部分内容:源代码的下载和源代码编译. 一.Android源代码下载 1)      配置 G ...

  7. Android系统启动流程--init进程的启动流程

    这可能是个系列文章,用来总结和梳理Android系统的启动过程,以加深对Android系统相对全面的感知和理解(基于Android11).  1.启动电源,设备上电 引导芯片代码从预定义的地方(固化在 ...

  8. Android系统启动流程(一) init进程启动过程解析

    init进程是Android系统第一个用户态的进程,init被赋予了很多重要的职责,比如我们熟悉的Zygote孵化器进程就是由init进程启动的.今天我们就来分析init进程的启动过程. 1 init ...

  9. Busybox init进程启动过程 (资料收集)

    http://blog.csdn.net/wjs1033/article/details/25740363 busybox的init busybox中的init程序可以完成初始化的基本功能而且去掉了S ...

最新文章

  1. onmouseout事件与onchange事件分析
  2. Go 语言编程 — 程序运行环境
  3. Linux-0.00 代码解析(三)
  4. Github之深入解析Ruby Gems缓存
  5. matplot绘制图形入门
  6. 编程语言流行指数:Python 稳居宝座,Java 滑坡!
  7. 小程序云开发实战一:小程序扫一扫获取到图书ISBN码(图书条形码)
  8. matlab 切点投资组合 程序,基于MATLAB的证券投资组合分析
  9. gopro7怎么回看视频_gopro7推荐帧数设置 gopro7视频格式设置
  10. Bugku杂项——旋转跳跃
  11. 编译原理-18-语法分析实验代码示例
  12. java 显示百分比_Java 数字转百分比%
  13. 【树莓派初始化】教你从0开始搭建树莓派的使用环境
  14. leetcode(力扣)刷题题解网站
  15. js中计算两个时间差
  16. linux 文件 复制 工具栏,Linux(Ubuntu)光盘镜像文件制作及使用攻略
  17. 如何运行从网上下载的iWatch项目详细步骤.
  18. vscode+springboot+vue前后端分离实现饭店点餐管理系统(二)
  19. java作业:根据三角形的3条边长,判断其是直角、钝角,还是锐角三角形。
  20. ZBrush 4R7操作常见问题

热门文章

  1. 华硕x550vc——6年后的性能测试
  2. 手把手教你选开源商城系统!
  3. gstreamer registry文件
  4. 信道估计算法误码率仿真,对比不同导频长度,对比不同信道估计算法包括CS-OMP,LS,MMSE
  5. php导入表格 出错,PHPExcel导入数据出现问题
  6. 让我们一起开发【菜谱系统】吧,滚雪球学 Python 第三轮项目计划
  7. 计算机设备类型分类,计算机外围设备的分类,都有哪些设备
  8. matlab图像算子变换,拉布拉斯算子锐化图像的空域和频域--matlab实现
  9. 中国各省市元宇宙政策汇编
  10. 在64位Ubuntu 16.04系统里安装Qt 5.9.1