Android 10.0 源码剖析:init 进程启动流程
2023-10-07 23:25:07
Android 系统启动是一个复杂的过程,涉及内核态和用户态两个阶段。init 进程是用户态第一个启动的进程,它负责完成系统启动过程中的大部分初始化工作。
init 进程概述
init 进程是由内核态的 0 号进程 idle(wrapper)启动起来的。它是一个轻量级进程,主要负责初始化用户空间和启动其他用户进程。init 进程的启动过程如下:
-
执行 /init 二进制文件
idle 进程执行 /init 二进制文件,这是 init 进程的可执行文件。
-
挂载根文件系统
init 进程挂载根文件系统,以便访问用户空间的文件。
-
初始化 libc 库
init 进程初始化 libc 库,这是 C 语言标准库。
-
加载 init 配置文件
init 进程加载 /init.rc 和 /init.rc.local 配置文件,其中包含了 init 进程的启动脚本。
-
执行 init 启动脚本
init 进程执行 init 启动脚本,这些脚本定义了系统启动过程中需要执行的操作。
init 启动脚本
init 启动脚本是一个文本文件,包含一系列命令。这些命令用于执行系统启动过程中的各种任务,例如:
- 挂载其他文件系统
- 启动系统服务
- 创建用户帐户
- 配置网络设置
init 脚本的执行顺序由脚本中的依赖关系决定。例如,一个脚本可能会依赖于另一个脚本先运行才能继续执行。
init 进程启动其他进程
init 进程通过调用 fork() 和 exec() 函数启动其他进程。这些进程负责执行系统启动过程中的各种任务,例如:
- systemd :systemd 是一个系统管理工具,负责管理进程和服务。
- udevd :udevd 是一个设备管理工具,负责检测和配置新连接的设备。
- dbus :dbus 是一个 IPC 框架,允许进程之间进行通信。
- Zygote :Zygote 是一个进程,负责创建和管理 Android 应用程序进程。
init 进程的退出
init 进程通常在系统启动过程完成后退出。它会在执行完所有 init 脚本并启动所有必要的进程后退出。init 进程的退出会触发 systemd 接管系统管理任务。
深入源码:init 进程启动流程
为了更深入地了解 init 进程的启动流程,我们来分析 Android 10.0 源码中的相关代码。
init 进程的启动代码位于 init/init.c 文件中。main() 函数是 init 进程的入口点,它执行以下主要步骤:
-
初始化 libc 库
main() 函数调用 libc_init() 函数来初始化 libc 库。
-
加载 init 配置文件
main() 函数调用 load_config() 函数来加载 /init.rc 和 /init.rc.local 配置文件。
-
执行 init 启动脚本
main() 函数调用 exec_script() 函数来执行 init 启动脚本。
-
启动 systemd
在执行完 init 启动脚本后,main() 函数调用 start_systemd() 函数来启动 systemd。
-
退出 init 进程
在启动 systemd 后,main() 函数调用 exit(0) 函数来退出 init 进程。
结论
init 进程是 Android 系统启动过程中的关键组件。它负责初始化用户空间、启动其他用户进程并协调系统启动过程。深入了解 init 进程的启动流程有助于我们更好地理解 Android 系统的启动机制。