当前位置: 首页 > 科技观察

OpenHarmonyRelease3.1启动子系统功能分析

时间:2023-03-16 02:13:21 科技观察

更多内容请访问:??????????????????????????????????????????????????1.技术背景OpenHarmonyrelease3.1不仅??在2.0的基础上增加了功能,还增强了各个模块组件的能力。本文重点介绍3.1版本的init启动子系统模块在启动和引导系统服务方面。分析。本文档基于码云上release3.1分支代码分析。启动子系统负责整个系统中各个进程的运行环境的构建和进程引导。不同层次的进程有不同的运行环境,运行环境决定了系统进程的设计。在启动子系统能力增强方面,主要有以下几个方面:基础能力增强:进程启动、回收机制增强、统一维护命令和插件管理。并行启动:最大化并行启动,提供依赖资源的同步机制,在运行时获取资源。按需启动:不启动不访问,减少常驻内存。分组启动:服务可以灵活组合,为整机提供不同的启动级别。2、Init启动功能概述(1)增强基础能力进程启动,支持进程selinux策略配置,扩展AccessToken设置,支持核心绑定配置;进程回收,支持频繁进程退出抑制机制;维护命令,统一的init维护命令,包括系统参数和进程管理;插件管理,init组件与外围模块高度相关,可以通过插件机制被其他模块扩展。(2)进程分组并行启动支持服务组配置,如支持系统知名组,支持机器启动、重启、关机、待机、充电等模式;支持服务依赖管理,支持并行启动依赖同步机制。(3)按需启动支持SA类进程、HDF类进程的按需启动、socket类进程的按需启动;支持热插拔事件驱动进程按需启动;支持定时启动,进程生成支持fd等辅助功能。3、系统能力增强点分析(1)进程启动能力增强进程启动时,支持在配置文件中配置服务进程的核心绑定、优先级、selinux策略加载和AccessToken信息。配置服务进程的核心绑定能力。在服务的cfg配置文件中,配置核心绑定,比如param_watcher服务。系统启动后,使用taskset-ppid查看服务的bindingcore状态,例如currentaffinitymask:3,表示param_watcher服务运行在两个CPU上并切换。"services":[{"name":"param_watcher",..."cpucore":[0,1]},通过CJSON解析cfg文件,得到属性"cpucore"属性值的数组,然后设置进程的CPU通过接口CPU_SET。init时设置CPU绑定核心,fork()服务子进程。配置服务进程优先级在servicecfg文件中配置进程优先级,例如在appspawn.cfg中配置"importance":-20,即设置appspawn的优先级为-20。{“服务”:[{“名称”:“appspawn”,“路径”:[“/system/bin/appspawn”],“重要性”:-20,“uid”:“root”,“gid”:["root"],"start-mode":"boot"}]代码中通过CJSON解析cfg文件中的"importance"属性获取服务的优先级,通过SetImportantValue保存优先级属性回调函数。在ServiceExec执行进程命令之前传递setpriority。设置服务的优先级。服务selinux策略加载OpenHarmony正在不断完善selinux安全策略,未来对服务的管控会更加严格。init在服务cfg文件中启动提供配置过程的Selinux接口,如updater_sa.cfg文件。“第二个”:“u:r:updater_sa:s0”。{“服务”:[{“名称”:“updater_sa”,“路径”:[“/system/bin/sa_main”,“/system/profile/updater_sa.xml”],“uid”:“系统”,“gid":["system","shell"],"secon":"u:r:updater_sa:s0"}]}通过JSON解析cfg文件中的secon属性,获取服务的selinux值。在init开始时,加载selinuxLoadPolicy。initfork子进程时,通过SetSecon设置服务的selinux。配置服务进程的AccessToken属性在服务cfg文件中配置进程的AccessToken,即在cfg文件中配置。"apl":"xxx",设置一串token。通过JSON解析cfg文件中的“apl”属性,获取服务的apl值。initfork子进程时设置进程的AccessToken。(2)进程启动和回收能力增强进程启动进程init在启动一个系统服务进程时,先fork然后execvs目标服务进程,完成启动。fork的过程又细分为pre-fork:即服务进程不需要真正启动,而是init准备服务,当服务被访问时拉起服务。fork:只要fork成功,init就会继续启动下一个进程,即使后面execv执行失败也会被忽略,最大职责是并行启动服务。execv:fork完成后,需要execv执行成功,才能完成服务启动。service:服务启动完成后,通过setparameter设置服务启动标志“startup.service.ctl.serviceName”为SERVICE_STARTED。子进程退出资源回收init监听到有子进程退出,需要waitpid回收进程,避免僵尸进程。设置服务启动的特殊模式通过在服务的cfg文件中配置Once、Disabled、Critical属性值来设置服务启动的特殊模式。Default:默认情况下,服务退出后,init会重新拉起服务。Once:服务为一次性启动方式,退出后init不会被拉起。Disabled:服务被禁用,退出后不会启动。Critical:服务失败后需要重启,但失败N次后系统会重启,默认4次。如果常驻服务进程一直异常退出,为了避免频繁尝试启动服务,增加了抑制机制。默认情况下,如果进程在3秒内连续退出5次以上,则不再自动启动该服务。如果核心服务进程一直异常退出,为避免系统不可用,尝试重启系统;默认情况下,如果进程在20秒内连续退出4次以上,服务将不再自动启动。例如,"critical":[1,1,60]表示存在critical属性,系统在60秒内重启一次。使用GetCritical函数分析临界属性,使用CalculateCrashTime函数判断是否需要重启服务或者需要重启系统。(3)提供整机状态服务每个系统服务进程启动后,对应的整机需要提供重启、关机等请求(对应整机状态的变化,进程可以相应处理stop、suspend、冻结等)。重启、关机shutdown:关闭服务进程,通过stop命令关闭服务。Suspendshutdown:STR开机低功耗关机,快速启动,服务可选择退出或清理资源。冻结关机:STD系统快照写入磁盘,可完全断电快速开机。通过reboot命令,设置“startup.device.ctl”参数,对外提供整机当前状态。系统服务进程可以通过ParameterClient的watch机制监控整机的状态变化,并对自身的状态进行处理。reboot命令:可以通过start/stop来启动和停止服务以下命令可以启动或停止服务。start_serviceservicename--startservicestop_serviceservicename--stopserviceservice_controlstartservicename--startserviceservice_controlstopservicename--stopservice最后通过SystemSetParameter("ohos.ctl.start",nameValue)启动服务,其中nameValue为服务名+服务参数组合数组。(4)按需启动SA进程启动需要按需启动的SA服务。通过在cfg文件中配置"dynamic":true,设置SA服务按需启动,即init在启动服务时解析该属性,不直接拉起服务;而是触发samgr通过客户端拉起服务。动态加载系统服务进程和SystemAbility。系统进程不需要在启动时启动,而是在访问SystemAbility时按需启动,加载指定的SystemAbility。继承SystemAbilityLoadCallbackStub类,重写OnLoadSystemAbilitySuccess(int32_tsystemAbilityId,constsptr&remoteObject)和OnLoadSystemAbilityFail(int32_tsystemAbilityId)方法。调用samgr提供的动态加载接口LoadSystemAbility(int32_tsystemAbilityId,constsptr&callback)。Samgr通过调用init提供的ServiceControlWithExtra接口拉起服务。UHDF进程按需启动和上面SA服务按需启动的分析一样,调用HUDF服务中的ServiceControlWithExtra接口拉起服务即可。套接字进程按需启动。init在pre-fork阶段为socket进程创建socket。Init监视创建的套接字上的网络事件。socket上有消息事件后,init启动socket进程处理消息。socket进程没有消息处理后,可以自动退出。退出后init回收子进程,重新监听socket网络数据。在服务cfg文件中添加“ondemand”:true配置,设置socket服务按需启动。子进程fork时,如果判断服务是ondemand,则创建socket进行监听。使用回调函数ProcessWatchEvent_按需处理套接字启动事件。热插拔服务进程根据需要启动,并在ueventd.cfg配置文件中配置设备节点属性。例如,/dev/binder属性配置为ohos.dev.binder。创建设备节点时,param将ohos.dev.binder属性值设置为已添加。在对应服务的cfg文件中,配置“job”作为条件,如下:“condition”:“ohos.dev.binder=added”表示满足条件时触发服务。Timingstart&fdgenerationhold定时启动:在服务进程退出前,可以根据业务需要预留下次启动的时间。fd代理持有者:按需启动进程,退出前保持fd状态句柄不丢失。在按需启动进程退出前,可以将fd发送给init代理,重启后即可获取到fd。在服务的cfg中配置“timer_start”:6,设置服务在6秒后启动。通过LE_CreateTimer创建一个定时器,当定时器到达时,触发回调函数启动服务。为fdhold创建socket,注册事件循环回调函数ProcessFdHoldEvent进行监听。(3)并行启动和依赖管理begetd的启动分为三个阶段,pre-init和init阶段完成公共依赖;所有后续服务都是并行启动的。服务启动的依赖包括Job和Service。一个Job的所有Jobs都是由init特权进程完成的,可能包括:设置全局环境变量、设置特权/proc、/sys节点参数等。可以在启动脚本中指定ServiceService依赖的前置条件来完成工作。例如,在服务中配置:"service":"jobs":{"on-start":"services:console"}"job":{"name":"services:console","cmds":["chmod0773/data/misc/trace","chmod0775/data/misc/wmtrace"]}即子进程fork时执行job相关命令。通过cfg文件设置服务的“start-mode”,管理正常启动或并行启动。"start-mode":"boot""start-mode":"normal""start-mode":"condition"其中boot和normal模式是并行启动,如果start-mode默认服务也是正常的没有写。必须通过启动服务来启动条件模式。Start-mode通过注册钩子函数,通过触发器启动服务。(6)群组管理系统服务可按群组管理,使用设备级知名群组完成整机开机、待机、充电等功能。整机默认开机是放在GROUP_BOOT,GROUP_CHARING是充电模式。以充电组为例。在device.charing.group.cfg中配置所需的作业、服务和组。解析组的cfg文件。通过哈希表保存组的配置。通过cmdline获取当前组模式,从而启动进入不同的组,系统进入不同的模式。4.总结Release3.1在OpenHarmony2.0的基础上进行了各方面的改进,提高了性能和稳定性。在Init组件中加入selinux配置,增强系统的安全模式。按需启动模式节省了系统内存资源。并行启动提高了系统的启动效率。组启动模式为后期系统进入不同的状态模式提供了有效的接口。总之,在开源社区,OpenHarmony在大家的共同努力下茁壮成长,总有一天会长成一棵枝繁叶茂的大树,造福人类。更多资讯请浏览:?????????????????????????????????????????????????????????