You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.2 KiB
71 lines
2.2 KiB
6 years ago
|
---
|
||
|
深入理解 init
|
||
|
---
|
||
|
|
||
|
#### 目录
|
||
|
|
||
|
1. 思维导图
|
||
|
2. 概述
|
||
|
3. 引入 init
|
||
|
4. init 进程的入口函数
|
||
|
5. 参考
|
||
|
|
||
|
#### 思维导图
|
||
|
|
||
|
#### 前言
|
||
|
|
||
|
init 是 Linux 系统中用户空间的第一个进程,由于 Android 是基于 Linux 内核的,所以 init 也是 Android 系统中用户空间的第一个进程,它的进程号是 1,作为一号进程,init 被赋予了很多及其重要的工作职责,总的来说主要做了以下三件事:
|
||
|
|
||
|
1. 创建和挂载启动所需的文件目录
|
||
|
2. 初始化和启动属性服务
|
||
|
3. 解析 init.rc 配置文件并启动 Zygote 进程
|
||
|
|
||
|
#### 引入 init
|
||
|
|
||
|
为了讲解 init 进程,首先要了解 Android 系统启动流程的前几步,以引入 init 进程:
|
||
|
|
||
|
1. 启动电源以及系统启动
|
||
|
|
||
|
当电源按下时引导芯片代码从预定义的地方(固化在 ROM)开始执行。加载引导程序 BootLoader 到 RAM 中,然后执行。
|
||
|
|
||
|
2. 引导程序 BootLoader
|
||
|
|
||
|
引导程序 BootLoader 是在 Android 系统开始运行前的一个小程序,它的主要作用是把系统 OS 拉起来并运行。
|
||
|
|
||
|
3. Linux 内核启动
|
||
|
|
||
|
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。在内核完成系统设置后,它首先在系统文件中寻找 init.rc 文件,并启动 init 进程。
|
||
|
|
||
|
4. init 进程启动
|
||
|
|
||
|
init 进程做的工作比较多,主要用来初始化和启动属性服务,也用来启动 Zygote 进程。
|
||
|
|
||
|
从上面的步骤可以看出,当我们按下启动电源时,系统启动后会加载引导程序,引导程序又启动 Linux 内核,在 Linux 内核加载完成后,第一件事就是启动 init 进程。
|
||
|
|
||
|
#### init 进程的入口函数
|
||
|
|
||
|
在 Linux 内核加载完成后,它首先在系统文件中寻找 init.rc 文件,并启动 init 进程,然后查看 init 进程的入口函数 main,代码如下:
|
||
|
|
||
|
```c
|
||
|
int SecondStageMain(int argc, char** argv) {
|
||
|
|
||
|
//初始化属性服务
|
||
|
property_init();
|
||
|
|
||
|
//启动属性服务
|
||
|
StartPropertyService(&epoll);
|
||
|
//解析 init.rc 文件等
|
||
|
LoadBootScripts();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void LoadBootScripts() {
|
||
|
Parser parser = CreateParser(action_manager, service_list);
|
||
|
|
||
|
parser.ParseConfig("/init.rc");
|
||
|
//...
|
||
|
}
|
||
|
```
|
||
|
|