0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于码云上release3.1分支代码进行分析

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-04-20 09:34 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1

技术背景

OpenHarmony release3.1版本在2.0的基础之上不仅增加了功能,而且各模块组件的能力也有所增强,本文就3.1版本的init启动子系统模块,在启动引导系统服务方面进行分析。本文档是基于码云上release3.1分支代码进行分析。

启动子系统负责整个系统各个进程运行时环境的构建及进程引导,不同层级的进程有着不同的运行环境,运行环境决定着系统进程的设计。在增强启动子系统能力方面有以下方面:

基础能力增强:进程启动、回收机制增强,维护命令统一以及插件化管理;

并行启动:最大化并行启动,为依赖资源提供同步机制,运行时进行资源获取;

按需启动:无访问不启动,减少常驻内存;

分组启动:可对服务进行灵活组装,提供整机不同的启动级别能力。

2

Init启动功能概述

1.基础能力的增强

进程启动,支持进程的selinux策略配置,扩展AccessToken设置,支持绑核配置;进程回收,支持进程频繁退出抑制机制;维护命令,统一init的维护命令,包括系统参数和进程管理;插件化管理,init部件与周边模块关联度高,通过插件化机制供其它模块扩展。

2.进程分组&并行启动

支持服务分组配置,如支持系统知名group,支持整机开机、重启、关机、待机、充电等模式;支持服务依赖管理,支持并行启动依赖同步机制。

3.按需启动

支持SA类进程按需启动,HDF类进程按需启动,socket类进程的按需启动;支持热插拔事件驱动进程按需启动;支持为按需启动定时启动、进程代持fd等辅助功能。

3

系统能力增强点分析

1.进程启动能力增强

进程启动时,支持在配置文件中配置服务进程的绑核、优先级、selinux策略加载以及AccessToken信息。

1)配置服务进程绑核能力

在服务的cfg配置文件中,配置绑核,例如param_watcher服务。系统启动之后通过taskset -p pid,查看服务绑核情况,例如 current affinity mask: 3,即表示param_watcher服务运行在两个cpu上切换。

“services” : [{“name” : “param_watcher”,…“cpucore” : [0,1]},

(左右移动查看全部内容)

通过CJSON解析 cfg 文件,获取属性”cpucore”属性值的数组,然后通过接口CPU_SET设置进程的CPU.

cd433c54-c041-11ec-bce3-dac502259ad0.png

在init,fork()服务子进程时设置CPU绑核。

cd74821e-c041-11ec-bce3-dac502259ad0.png

2)配置服务进程优先级

在服务cfg文件中配置进程的优先级,例如appspawn.cfg中配置"importance" : -20,即设置appspawn的优先级为-20。

{ "services" : [{ "name" : "appspawn", "path" : ["/system/bin/appspawn"], "importance" : -20, "uid" : "root", "gid" : ["root"], "start-mode" : "boot" } ] }

代码中通过CJSON解析cfg文件中”importance”属性,得到服务的优先级,同时通过SetimportantValue回调函数保存优先级属性。

cd8e02a2-c041-11ec-bce3-dac502259ad0.png

在ServiceExec执行进程命令之前通过setpriority设置服务的优先级。

cda7018a-c041-11ec-bce3-dac502259ad0.png

3)服务的selinux策略加载

OpenHarmony正在不断完善selinux安全策略,后面对于服务的管控会更加严格。Init启动在服务cfg文件中提供配置进程的Selinux接口,例如updater_sa.cfg文件中配置

“secon” : “uupdater_sa:s0”。 {“services” : [{“name” : “updater_sa”,“path” : [“/system/bin/sa_main”, “/system/profile/updater_sa.xml”],“uid” : “system”,“gid” : [“system”, “shell”],“secon” : “uupdater_sa:s0”}]}

通过JSON解析cfg文件中"secon"属性,获取服务的selinux值。

cdbc954a-c041-11ec-bce3-dac502259ad0.png

在init初始时,加载selinux LoadPolicy。

cdda54b8-c041-11ec-bce3-dac502259ad0.png

在init fork子进程时,通过SetSecon 设置服务的selinux。

cdf0c5d6-c041-11ec-bce3-dac502259ad0.png

4)配置服务进程AccessToken属性

在服务cfg文件中配置进程的AccessToken,即cfg文件中配置“apl”: “xxx”,设置一串令牌。

通过JSON解析cfg文件中"apl"属性,获取服务的apl值。

ce121614-c041-11ec-bce3-dac502259ad0.png

在init fork 子进程的时候设置进程的AccessToken.

ce352fc8-c041-11ec-bce3-dac502259ad0.png

2.进程启动&回收能力增强

1)进程的启动流程

init启动系统服务进程时都是先fork再execv执行目标服务进程而完成启动。Fork的流程又细分为

pre-fork:即服务进程不需要真正的启动,只是由init做好服务的准备工作,服务被访问时拉起服务;

fork:只要fork成功,init就接着启动下一个进程,即使后面execv执行失败也忽略,最大承担并行启动服务;

execv:fork完成之后需要execv执行成功,才算服务启动完成;

service:在服务启动完成之后,通过setparameter 设置服务启动标志"startup.service.ctl.serviceName" 为SERVICE_STARTED。

ce4e0cf0-c041-11ec-bce3-dac502259ad0.png

ce6779a6-c041-11ec-bce3-dac502259ad0.png

2)子进程退出资源回收

init监听到任何子进程退出都需要waitpid回收该进程,避免出现僵尸进程。

ce849fea-c041-11ec-bce3-dac502259ad0.png

3)设置服务启动特殊模式

通过在服务的cfg文件中配置Once、DisabLED、Critical属性值设置服务启动的特殊方式。

Default:默认情况下服务退出之后,init会再次拉起服务;

Once:服务是单次启动模式,退出之后init不再拉起;

Disabled:服务是被禁用的,退出后也不会拉起;

Critical:服务失败后需要重新拉起,但是失败N次之后,系统就会重启,默认是4次。

常驻服务进程如果一直异常退出,为了避免频繁尝试拉起该服务,增加抑制机制,默认3秒内连续退出超过5次则不再自动拉起该服务。

核心服务进程如果一直异常退出,为了避免系统不可用,尝试系统重启;默认20秒内连续退出超过4次则不再自动拉起该服务。

例如 “critical” : [1, 1, 60], 代表有critical attribute,同时60秒内重启1次,就系统重启。通过GetCritical函数解析critical 属性,通过CalculateCrashTime函数判断是否需要重启服务,或是reboot系统。

ceb266e6-c041-11ec-bce3-dac502259ad0.png

cec8d462-c041-11ec-bce3-dac502259ad0.png

3.提供整机状态服务

1)整机状态

各系统服务进程启动后,还需要相应整机提供的重启、关机等请求(对应整机状态变化能够对进程进行相应处理stop、suspend、freeze等)。

重启、shutdown关机:关闭服务进程,通过stop命令关闭服务;
Suspend关机:STR带电低功耗关机,可快速开机,服务可选择的退出或清理资源;
Freeze关机:STD系统快照写到Disk,可完全掉电并快速开机。

通过reboot命令,设置 "startup.device.ctl"参数给外界提供当前整机的状态,系统服务进程可通过ParameterClient的watch机制监听整机的状态变化,处理自己的状态。
Reboot 命令:

cee33df2-c041-11ec-bce3-dac502259ad0.png

cf08bcd0-c041-11ec-bce3-dac502259ad0.png

2)服务可以通过start/stop来启动停止

通过以下命令可以启动或者停止服务。

start_service servicename --start servicestop_service servicename --stop serviceservice_control start servicename --start serviceservice_control stop servicename --stop service

cf30a5ce-c041-11ec-bce3-dac502259ad0.png

最终通过SystemSetParameter(“ohos.ctl.start”, nameValue)启动服务,其中nameValue是服务名+服务的参数组合数组。

cf5983d6-c041-11ec-bce3-dac502259ad0.png

4.按需启动

1)SA进程按需启动

需要按需启动的SA服务,通过在cfg文件配置”dynamic” : true,设置此SA服务为按需启动,即init在start service的时候解析到此属性,不直接拉起服务;而是通过client端触发samgr拉起服务。

动态加载系统服务进程及SystemAbility, 系统进程无需开机启动,而是在SystemAbility被访问的时候按需拉起,并加载指定SystemAbility。继承SystemAbilityLoadCallbackStub类,并覆写OnLoadSystemAbilitySuccess(int32_t systemAbilityId, const sptr& remoteObject)、OnLoadSystemAbilityFail(int32_t systemAbilityId)方法。

cf9291f8-c041-11ec-bce3-dac502259ad0.png

调用samgr提供的动态加载接口LoadSystemAbility(int32_t systemAbilityId, const sptr& callback)。

cfc3dc7c-c041-11ec-bce3-dac502259ad0.png

Samgr通过调用init提供的ServiceControlWithExtra接口,拉起服务。

cff42896-c041-11ec-bce3-dac502259ad0.png

3)socket进程按需启动

init在pre-fork阶段为socket类进程创建好socket,init中监听创建好的socket上的网络事件,socket上有报文事件后,init拉起socket进程进行报文处理。

socket进程无报文处理后,可以自动退出,退出后init回收该子进程并重新监听socket网络数据。

在服务cfg文件中添加”ondemand” : true 配置,设置socket服务为按需启动。

d0144266-c041-11ec-bce3-dac502259ad0.png

在fork 子进程的时候,判断服务是ondemand的,则创建socket监听。

d02c4456-c041-11ec-bce3-dac502259ad0.png

通过回调函数ProcessWatchEvent_处理socket按需启动的事件。

d044b78e-c041-11ec-bce3-dac502259ad0.png

4)热插拔服务进程按需启动

配置ueventd.cfg配置文件中设备节点属性,例如,/dev/binder属性配置为 ohos.dev.binder,当设备节点被创建好,param设置ohos.dev.binder属性值为added。

在相应服务的cfg文件中,配置”job”为condition,如下:

“condition” : “ohos.dev.binder=added”

即当条件满足时触发服务拉起。

5)定时拉起&fd代持

定时拉起:服务进程在退出前可根据业务需要预约下次启动的时间。

fd代持:按需启动进程可以保持退出前的fd状态句柄不丢失。按需启动进程退出前可发fd发送给init代持,再次启动后再获取fd。

在服务的cfg配置"timer_start" : 6 ,设置服务6秒后拉起。通过LE_CreateTimer创建定时器,定时时间到达时,触发回调函数,拉起服务。

d07679cc-c041-11ec-bce3-dac502259ad0.png

创建fdhold的socket,注册event loop回调函数ProcessFdHoldEvent监听。

d0993516-c041-11ec-bce3-dac502259ad0.png

5.并行启动及依赖管理

begetd启动分三个阶段,pre-init和init阶段完成公共依赖部分;后续所有的服务都是并行化启动。服务启动的依赖包括Job和Service。

1)Job

所有的Job由init特权进程完成,可包括:设置全局环境变量,设置特权/proc, /sys节点参数等。

2)Service

Service依赖的前置条件可在启动脚本里指定Job完成。例如在service 中配置

“service”:“jobs” : { “on-start” : “services:console” }“job”:{ “name” : “services:console”, “cmds” : [ “chmod 0773 /data/misc/trace”, “chmod 0775 /data/misc/wmtrace” ]}

即在fork子进程的时候执行job相关的命令。

d0b1f63c-c041-11ec-bce3-dac502259ad0.png

通过cfg文件设置服务的”start-mode”来管理正常启动还是并行启动。

“start-mode” : “boot”“start-mode” : “normal”“start-mode” : “condition”


其中boot、normal 模式是并行启动,service不写start-mode默认也是normal。Condition模式必须通过 start service 来拉起。

Start-mode通过注册钩子函数,通过trigger拉起服务。

d0dbea3c-c041-11ec-bce3-dac502259ad0.png

6.分组管理

系统服务可以按照分组进行管理,设备级知名group用于完成整机的开机、待机、充电等功能。默认的整机开机是放到GROUP_BOOT中,GROUP_CHARING是充电模式。

以charging group举例说明。

配置device.charing.group.cfg 里面设置需要的jobs、services以及groups。

d10fa232-c041-11ec-bce3-dac502259ad0.png

解析group 的cfg文件。

d13f1c24-c041-11ec-bce3-dac502259ad0.png

通过hash表保存group的配置。

通过cmdline获取当前的group 模式,从而启动进入不同的group,系统进入不同的模式。

d15f15ba-c041-11ec-bce3-dac502259ad0.png

4

总结

Release3.1 版本在OpenHarmony2.0的基础上各方面能力都有所提升,性能和稳定性方面有所改善。Init组件中加入selinux配置,增强了系统的安全模式,按需启动模式节约系统的内存资源,并行启动增加了系统的启动效率,分组启动模式为后期系统进入不同状态模式提供有效的接口。总之OpenHarmony在开源社区中,通过大家的共同努力正在茁长成长,总有一天会长成苍天大树,枝繁叶茂,造福人类。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 子系统
    +关注

    关注

    0

    文章

    115

    浏览量

    13306
  • OpenHarmony
    +关注

    关注

    31

    文章

    3927

    浏览量

    20725

原文标题:OpenHarmony release 3.1 版本启动子系统功能分析

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行代码块; } 其语义是:如果表达式的值为真,则执行其后的语句,否则不执
    发表于 11-25 07:48

    蜂鸟E203简单分支预测的改进

    当前指令的类型是普通指令还是分支跳转指令。当译码信息指示当前指令为分支跳转指令时,则在一个周期内进行分支预测。 蜂鸟E203的分支预测十
    发表于 10-24 07:45

    如何在vivado基于二进制对指令运行状态进行判断

    a0 -8 为例 获取相应的二进制将其转换为16进制导入vivado,方法就是将代码文件修改为.verilog文件并存入蜂鸟的tb文件夹,在vivado的tb中修改测试用例路径即可进行仿真。 得到
    发表于 10-24 06:46

    在vivado基于二进制对指令运行状态进行判断

    a0 -8 为例 获取相应的二进制将其转换为16进制导入vivado,方法就是将代码文件修改为.verilog文件并存入蜂鸟的tb文件夹,在vivado的tb中修改测试用例路径即可进行仿真。 得到结果
    发表于 10-24 06:31

    提高条件分支指令预测正确率的方法

    内核中完整地插入这一分支预测器,需要修改e203_ifu_ifetch模块与e203_ifu_litebpu模块。 上图为gshare结构框图 最终实现效果 如图,我们在预测器中添加了两个计数
    发表于 10-22 08:22

    工业物联网平台有哪些低代码应用

    多协议支持:主流平台(如领方案、AIRIOT)内置200+工业协议驱动包(如MQTT、Modbus、OPC UA),通过JSON配置实现协议转换,支持自定义协议扩展。例如,领方案支持“即插即用”设备接入,10钟完成设备
    的头像 发表于 09-24 14:49 420次阅读

    测试小白3钟上手,零代码自动化测试平台,15钟搭建自动化测试方案

    还在为不懂代码、搭建测试方案耗时久而发愁?ATECLOUD 零代码自动化测试平台,专为自动化测试量身打造,小白3 分钟就能轻松上手,15 分钟即可完成自动化测试方案搭建,彻底打破传统测试的技术壁垒与效率瓶颈。
    的头像 发表于 09-22 17:52 620次阅读
    测试小白3<b class='flag-5'>分</b>钟上手,零<b class='flag-5'>代码</b>自动化测试平台,15<b class='flag-5'>分</b>钟搭建自动化测试方案

    代码自动化测试平台ATECLOUD功能详解

    ATECLOUD 是由纳米软件开发的高度可扩展零代码测试平台,专为电子仪器自动化测试企业设计,提供高性价比数字化转型方案。 一、ATECLOUD与传统测试系统的核心差异 ATECLOUD智能测试
    的头像 发表于 08-20 17:32 791次阅读
    零<b class='flag-5'>代码</b>自动化测试平台ATECLOUD功能详解

    代码开发平台是什么?零编程零成本搭建

    联网平台作为连接物理设备与数字世界的核心枢纽,其功能设计围绕设备管理、数据流转、应用开发、业务赋能四大维度展开。 一、核心能力 低代码/零代码:通过可视化拖拽组件、预置模板、图形化逻辑编排代替手写
    的头像 发表于 07-31 15:25 586次阅读

    什么是零代码平台?

    代码平台是一种无需编写传统代码,通过可视化拖拽、参数配置、逻辑连线即可快速搭建业务流程与应用系统的工具平台。它将复杂的软件开发过程转化为 “搭积木” 式的操作,让非技术人员(如业务人员、运营人员
    发表于 07-12 20:28

    工业组态在智慧水利的应用

    、实际案例等方面进行阐述: 应用场景 水质监测:工业组态可实现对水质分析传感器和水质分析仪器仪表的远程监控。通过
    的头像 发表于 06-20 16:11 388次阅读

    润和的Hi3861开发版如何连接华为

    刚入手了一套润和的Hi3861开发套件,下载的是3.2Release版本的源码,想连接华为但是润和那边的代码仓中没有相关的demo,,求大佬指点
    发表于 04-11 20:32

    设备全生命周期管理:扫+数字孪生技术深度应用

    工业4.0与智能制造背景下,设备管理从“故障后响应”向“全生命周期主动管控”转变。通过扫与数字孪生技术,设备管理的边界被重新定义,效率跃升。中设智控等企业实践案例展示了数字化与数字孪生技术赋能设备管理系统的智能化升级。
    的头像 发表于 03-07 10:15 767次阅读
    设备全生命周期管理:扫<b class='flag-5'>码</b><b class='flag-5'>上</b><b class='flag-5'>云</b>+数字孪生技术深度应用

    EE-157:ADSP-TS101分支目标缓冲器说明

    电子发烧友网站提供《EE-157:ADSP-TS101分支目标缓冲器说明.pdf》资料免费下载
    发表于 01-14 15:05 0次下载
    EE-157:ADSP-TS101<b class='flag-5'>上</b>的<b class='flag-5'>分支</b>目标缓冲器说明

    Gitee:玩转代码托管与协作的高效指南

    1、简介 众所周知,GitHub 服务器在国外,如果网络不好的话,严重影响使用体验,甚至会出现登录不的情况。 针对这个情况,可以使用国内的项目托管平台—— Gitee ,来替代 Github
    的头像 发表于 12-24 11:39 2632次阅读
    Gitee:玩转<b class='flag-5'>代码</b>托管与协作的高效指南