【OpenHarmony】startup_init 模块
startup_init模块是OpenHarmony系统的用户态启动入口(pid=1),负责从内核引导到系统服务拉起的全流程管理。该模块采用分阶段设计:第一阶段完成设备节点创建和关键分区挂载,第二阶段实现参数服务、配置加载和服务管理。核心功能包括服务生命周期管理(启动/停止/重启)、配置驱动的命令执行机制,以及崩溃恢复等容错处理。模块通过.cfg/JSON配置文件定义jobs和服务,采用状态机模式
·
startup_init 模块
1. 模块概述
源码地址:https://gitee.com/openharmony/startup_init
1.1 功能与目标
startup_init 主模块是系统用户态的启动入口(pid=1),负责从早期引导到系统服务拉起的全链路编排。核心目标如下:
- 完成第一阶段初始化:创建设备节点、挂载关键分区、切换到第二阶段;
- 完成第二阶段初始化:参数服务、配置加载、作业触发、服务拉起、信号回收;
- 提供统一的
service生命周期管理(启动、停止、重启、崩溃恢复); - 提供配置驱动的命令执行与触发机制(
pre-init/init/post-init与 trigger jobs)。
典型场景:
- 正常开机流程;
- 充电模式、救援模式、维护恢复模式等分支启动;
- 服务崩溃后自动恢复或触发保护性重启(critical 服务)。
1.2 系统位置
该模块位于 startup 子系统核心位置,是系统启动主控模块:
- 上游:内核启动后拉起
init(/bin/init); - 下游:参数服务、文件系统管理、sandbox、ueventd、service 控制链路;
- 对外:通过参数与服务控制接口向其他模块暴露状态与控制能力。
定位:核心模块(启动编排中心),其他启动相关模块多为其依赖或协作模块。
1.3 设计思路与模式
设计思路
- 分阶段启动:first-stage(最小可用环境)+ second-stage(完整初始化);
- 配置驱动:通过
.cfg/JSON 配置定义 jobs 与 services; - 事件驱动:基于 trigger/loop/signal 机制驱动作业与服务状态变化;
- 容错恢复:服务崩溃计数、定时重启、critical 保护策略。
设计模式
- 状态机模式:启动阶段与服务状态按固定状态流转;
- 观察者/事件分发模式:信号、触发器、socket 事件回调;
- 插件/钩子扩展模式:
HookMgr在不同 boot stage 注入能力; - 命令模式:命令字符串映射到
CmdTable执行函数。
1.4 系统框图
2. 模块结构
2.1 源文件与头文件
入口与阶段管理
services/init/main.c:主入口,串联SystemPrepare -> SystemInit -> SystemExecuteRcs -> SystemConfig -> SystemRun。services/init/standard/main_early.c:早期 init 入口。services/init/standard/init_firststage.c:first-stage 逻辑(挂载、切换 second-stage)。services/init/standard/init.c:second-stage 主流程实现。services/init/include/init.h:模块总入口声明。
配置与解析
services/init/init_config.c:解析.cfg,加载 services/jobs/import。services/init/include/init_jobs_internal.h:job 结构与配置路径定义。
服务管理
services/init/init_service_manager.c:Service 实例构建、属性解析、按名控制。services/init/init_common_service.c:Service 生命周期核心逻辑(start/stop/reap/timer)。services/init/standard/init_service.c:标准平台服务执行细节。services/init/include/init_service.h:Service 结构体、属性位、核心 API。services/init/include/init_service_manager.h:service 管理接口。
命令与作业
services/init/init_common_cmds.c:通用命令解析与执行框架。services/init/standard/init_cmds.c:标准平台命令集实现。services/init/standard/init_cmdexecutor.c:命令执行器注册与插件命令。services/init/standard/init_jobs.c:jobs 与 trigger 执行。services/init/include/init_cmds.h:命令表与执行上下文定义。
运行支撑
services/init/standard/init_signal_handler.c:SIGCHLD/SIGTERM 处理与子进程回收。services/init/adapter/init_adapter.c:平台适配(能力保留、rcS 执行等)。services/init/standard/init_mount.c:分区挂载辅助。interfaces/innerkits/include/service_control.h:服务状态枚举与控制 API。
2.2 类、结构体、函数与方法
主模块以 C 实现为主,核心是结构体 + 函数组合:
Service(init_service.h)- 描述服务全量状态:名称、pid、属性位、权限、cap、socket/file、timer、jobs、context、error。
- 关键字段:
status、attribute、startMode、endMode、serviceJobs。
ServiceSpace- 全局服务空间计数与管理上下文(
g_serviceSpace)。
- 全局服务空间计数与管理上下文(
CmdLine/CmdLines- job 命令集合抽象,支持索引执行。
ConfigContext- 配置上下文(主系统/芯片上下文),影响命令执行域。
关键函数:
- 主流程:
SystemPrepare():first-stage 准备;SystemInit():second-stage 基础初始化;SystemConfig():参数/配置/trigger/service 启动编排;SystemRun():进入事件循环。
- 配置解析:
ParseInitCfg()、ReadConfig()、ParseAllServices()、ParseAllJobs()。
- 服务控制:
ServiceStart()、ServiceStop()、ServiceTerm()、ServiceReap();StartServiceByName()、StopServiceByName()、TermServiceByName()。
- 命令执行:
DoCmdByIndex()、ExecCmd()、GetCmdLinesFromJson();- 标准命令如
start/stop/mount/chmod/chown/write/reboot/...。
2.3 继承与多态
主模块为 C 风格实现,无 C++ 继承层次。
“多态”由以下机制实现:
- 命令表
CmdTable+ 函数指针,按命令名动态分派; - 插件命令
PluginCmdExecutor+ hook 扩展,实现运行时行为扩展; - 不同平台目录(
standard/lite)实现同名接口的编译期切换。
2.4 模块“类图/结构关系图”
2.5 模块内部依赖框图
3. 模块间交互
3.1 交互描述
-
与
param子系统:- 初始化参数服务(
InitParamService); - 读写系统参数(
SystemReadParam/SystemWriteParam); - 通过参数发布服务状态(
startup.service.ctl.<name>)。
- 初始化参数服务(
-
与
fs_manager/挂载链路:- first-stage 加载
fstab.required、挂载关键分区; - second-stage 执行
mount_fstab等命令。
- first-stage 加载
-
与
ueventd:- first-stage 触发设备事件,确保必要设备节点就绪。
-
与
sandbox:- 根据服务路径与策略进入对应 sandbox。
-
与
samgr/其他服务:- 通过 init 启动配置拉起系统服务进程。
3.2 异步、事件驱动与多线程
- 事件驱动:
- 基于
loopevent处理 signal、watcher、timer; - trigger/job 事件驱动作业执行。
- 基于
- 异步处理:
- 服务进程由
fork+exec启动,SIGCHLD 异步回收; - 定时重启由
LE_Timer异步触发。
- 服务进程由
- 多线程/多进程:
- 主体为单进程事件循环 + 多子进程服务模型;
- 关键并发来自子进程生命周期与异步信号。
3.3 外部依赖框图
4. 状态机转换图
4.1 状态机模型
主模块建议分为两层状态机:
- 系统启动阶段状态机(Boot Pipeline);
- 服务生命周期状态机(Service Lifecycle)。
4.2 状态机树图
4.3 状态机切换规则
-
启动阶段切换
FirstStage -> SecondStageInit:关键分区挂载并execv("/bin/init --second-stage");SecondStageInit -> ConfigLoaded:参数服务与配置解析完成;ConfigLoaded -> JobsTriggered:触发pre-init/init/post-init;JobsTriggered -> EventLoopRunning:进入主循环。
-
服务状态切换
IDLE -> STARTING/STARTED:执行ServiceStart;STARTED -> READY:服务主动上报 ready(若支持);STARTED/READY -> STOPPING -> STOPPED:stop/term 或退出回收;STOPPED -> STARTED:按策略重启(once/ondemand/timer/critical 规则)。
-
事件触发
- 配置命令触发:
start/stop/reset/trigger; - 信号触发:
SIGCHLD子进程退出; - 时间触发:周期/延迟重启定时器;
- 条件触发:critical 崩溃阈值触发
panic reboot。
- 配置命令触发:
4.4 状态机转换图
5. 接口设计
5.1 公共接口
模块主入口接口(内部主控)
void SystemPrepare(long long uptime);- 功能:first-stage 环境准备与必要分区挂载;
- 返回:无,失败路径可触发中止/重启。
void SystemInit(void);- 功能:second-stage 基础环境初始化(socket、fd holder、时区等)。
void SystemConfig(const char *uptime);- 功能:参数服务初始化、配置加载、触发 boot jobs、启动服务。
void SystemRun(void);- 功能:进入事件循环。
void SystemExecuteRcs(void);- 功能:执行
/etc/init.d/rcS(按平台宏控制)。
- 功能:执行
服务控制接口(对外)
int ServiceControl(const char *serviceName, int action);int ServiceControlWithExtra(const char *serviceName, int action, const char *extArgv[], int extArgc);int ServiceWaitForStatus(const char *serviceName, ServiceStatus status, int waitTimeout);int ServiceSetReady(const char *serviceName);int StartServiceByTimer(const char *serviceName, uint64_t timeout);int StopServiceTimer(const char *serviceName);
ServiceStatus 典型值:SERVICE_IDLE/STARTING/STARTED/READY/STOPPING/STOPPED/ERROR/CRITICAL。
命令接口(配置驱动)
命令通过 CmdTable 暴露,典型包括:
- 服务类:
start/stop/reset/termservice; - 文件系统类:
mount/mount_fstab/umount/mkdir/chmod/chown; - 系统类:
setparam/trigger/reboot/export/write/sleep/wait。
5.2 数据交换接口
-
配置交换
- 输入:
/etc/init.cfg、etc/init/*.cfg、模式特定目录配置; - 格式:JSON(services/jobs/import)。
- 输入:
-
参数交换
- 通道:
SystemReadParam/SystemWriteParam; - 关键参数:
ohos.boot.mode、startup.service.ctl.<service>等。
- 通道:
-
进程与事件交换
- 通道:signal(SIGCHLD/SIGTERM)、socket watcher、timer 回调;
- 协议:POSIX 信号 + loopevent 事件模型。
5.3 接口调用时序图
更多推荐

所有评论(0)