本文作者:江苏润和软件股份有限公司 郎建中
1.总体描述
1.1.总体介绍
启动恢复负责在内核启动之后到应用启动之前的系统关键进程和服务的启动过程。涉及以下模块:
a) init启动引导
支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。
负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。
b) appspawn应用孵化
支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。
负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。
c) bootstrap启动服务模块
支持使用LiteOS-M内核的平台,当前包括:Hi3861平台。
提供了各服务和功能的启动入口标识。在SAMGR启动时,会调用boostrap标识的入口函数,并启动系统服务。
d) 系统属性
支持使用LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300平台,Hi3518EV300平台。
负责提供获取与设置操作系统相关的系统属性。
系统属性包括:默认系统属性、OEM厂商系统属性和自定义系统属性。
2.代码目录结构
base
├──startup 启动恢复子系统根目录
├──── frameworks
│ └── syspara_lite
│ ├── LICENSE 开源LICENSE文件
│ ├── parameter 系统属性模块源文件目录
│ │ ├── BUILD.gn
│ │ └── src
│ │ ├── BUILD.gn
│ │ ├── param_impl_hal 系统属性模块基于LiteOS-M核实现
│ │ └── param_impl_posix 系统属性模块基于LiteOS-A核实现
│ └── token
│ ├── BUILD.gn
│ └── src
│ ├── token_impl_hal
│ └── token_impl_posix
├──── hals
│ └── syspara_lite 系统属性模块硬件抽象层头文件目录
├──── interfaces
│ └── kits
│ └── syspara_lite 系统属性模块对外接口目录
└──── services
├── appspawn_lite 应用孵化模块
│ ├── BUILD.gn 应用孵化模块编译配置
│ ├── include 应用孵化模块头文件目录
│ ├── LICENSE 开源LICENSE文件
│ ├── moduletest 应用孵化模块自测试代码目录
│ └── src 应用孵化模块源文件目录
├── bootstrap_lite 启动服务模块
│ ├── BUILD.gn 启动服务模块编译配置
│ ├── LICENSE 开源LICENSE文件
│ └── source 启动服务模块源文件目录
└── init_lite 启动引导模块
├── BUILD.gn 启动引导模块编译配置
├── include 启动引导模块头文件目录
├── LICENSE 开源LICENSE文件
├── moduletest 启动引导模块自测试代码目录
└── src 启动引导模块源文件目录
vendor
└──huawei
└──camera
└──init_configs 启动引导模块配置文件目录(json格式,部署于/etc/目录下)
3.代码分析
本文主要分析init和Spawn模块中的流程。主要分析如下几个部分的流程:
1、init模块的初始化过程–启动系统服务
2、init模块的保活流程
3、appspawn的初始化
4、appspawn的孵化流程
3.1.init模块的初始化过程–启动系统服务
init进程是在操作系统启动后第一个启动的进程。也是所有其他进程的父进程。
init进程的代码位置:base/startup/services/init_lite,下面是代码的目录结构:
整个目录将被编译成一个可执行程序init。下面我们从main.c的main函数开始分析。
main()函数的代码如下:
上面的代码注释已经非常好了,这里简单翻译下。代码分4个步骤:
1、打印系统信息。这个很简单,就是打印一下当前的版本信息。
2、注册信号处理。这里主要是注册系统信号量的处理函数。
3、读取配置文件并按照配置启动服务
4、进入死循环
下面我们先看看系统信号处理部分的SignalInitModule()函数,代码如下:
上面的代码可以看到,这里是注册了两个系统信号的处理。并且处理函数都是SigHandler()。
SIGCHLD信号:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。这里应该是指init进程Fork出来的其他服务进程。
SIGT