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

Hi3861_WiFi物联网项目:了解启动和恢复子系统

时间:2023-03-19 15:42:10 科技观察

了解更多请访问:鸿蒙科技社区https://harmonyos.51cto.com,与华为官方合建2.ohos_bundles三、项目目录结构4.理解IoT外设控制模块4.1BUILD.gn扩展4.2led_example.c扩展4.3整体理解IoT外设控制模块5.理解启动恢复子系统5.1#A分析SYS_INIT(service)5.2#B分析MODULE_INIT(run)5.3#C分析SAMGR_Bootstrap()X.总结:更新记录:说明:本文为《Hi3861_WiFi物联网项目的一点认识》的新篇章,版本升级到v1.6。前见章节:Hi3861_WiFi物联网项目v1.0一点认识Hi3861_WiFi物联网项目:物联网外设控制模块5.了解启动和恢复子系统这是一个非常重要的子系统。之前的文章《鸿蒙系统的启动流程》做了一些简单的工作分析,建议先阅读《鸿蒙系统的启动流程v3.0》Part1/2的Chapter3/4。在这里,我们先去鸿蒙系统整体看一下,再回到这个项目来对比一下,看看hpm的剪裁给我们留下了什么。还是先阅读官方readme,重新整理一下目录结构。启动恢复子系统负责从内核启动后到应用程序启动前系统关键服务进程的启动过程,以及恢复设备出厂设置的功能。涉及到以下组件:initbootstrap组件initbootstrap组件对应的进程是init进程,它是内核完成初始化后启动的第一个用户态进程。init进程启动后,根据分析结果读取init.cfg配置文件,执行相应的命令依次启动各个关键的系统服务进程,并在启动系统服务进程的同时设置其相应的权限。Appspawn应用孵化组件负责接收用户程序框架孵化应用进程的命令,设置新进程的权限,调用应用框架的入口函数。引导服务启动组件为每个服务和功能提供启动入口标识符。SAMGR启动时,会调用boostrap标识的入口函数,启动系统服务。syspara系统属性组件系统属性组件根据HarmonyOS产品兼容性规范,提供获取设备信息的接口,如:产品名称、品牌名称、厂商名称等,并提供设置/读取系统属性的接口。启动组件负责提供大型系统(参考内存≥1GB)获取与设置操作系统相关的系统属性。大型系统支持的系统属性包括:设备类型、产品名称等设备信息,系统版本、API版本等系统信息以及其他默认的系统属性。两者对比,可以看到Hi3861工程相比完整系统(先灰显),删掉了appspawn_lite和init_lite这两个组件,因为启动方式/流程有很大差异,其实很容易明白是砍init_lite,但是没仔细研究为什么appspawn_lite会被砍掉。这里只分析Hi3861的bootstrap_lite。至于syspara_lite,就比较简单了。可以按照官方文档中上表右侧的调用顺序获取属性信息。Appspawn_lite和init_lite是两个组件。自己搞清楚相关细节后,会完善成《鸿蒙系统的启动流程》的更新版本,或者单独写一篇理解总结。以下文字其实是《鸿蒙系统的启动流程v3.0》Part2《4.第四阶段:鸿蒙系统框架层启动》的完整解析版。官方readme用两句话描述了bootstrap服务的启动组件。如何理解:“提供各种服务和功能的启动入口标识。”它引用了//base/startup/services/bootstrap_lite/source/core_main.h文件中定义的宏的头文件:SYS_INIT(name)和MODULE_INIT(name)。【这里强烈推荐阅读:连志安老师的《分析 helloworld程序是如何被调用,SYS_RUN做什么事情》和唐作霖的《SYS_RUN()和MODULE_INIT()之间的那些事》这两篇文章。】“SAMGR启动时,会调用boostrap标识的入口函数,启动系统服务。”意思是system_init.c文件中的HOS_SystemInit()函数调用了SAMGR_Bootstrap();启动系统服务。什么是“boostrap识别的入口函数”,我们在下面进行解释。voidHOS_SystemInit(void){MODULE_INIT(bsp);MODULE_INIT(device);MODULE_INIT(core);SYS_INIT(service);//#ASYS_INIT(feature);MODULE_INIT(run);//#BSAMGR_Bootstrap();//#C}灰色部分我还没有深入,先略过,但是如果你看懂了后面的内容,灰色部分基本就明白了。5.1#A分析SYS_INIT(service)打开//base/startup/services/bootstrap_lite/source/core_main.h文件,项目使用gcc编译器编译,所以定义了__GNUC__。将服务代入其中并展开:#defineSYS_INIT(service)\do{\SYS_CALL(service,0);\}while(0)#defineSYS_CALL(service,0)\do{\InitCall*initcall=(InitCall*)(SYS_BEGIN(service,0));\InitCall*initend=(InitCall*)(SYS_END(service,0));\for(;initcallRegisterService((Service*)&bootstrap);}它首先会得到一个SAMGR实例实例,并向这个实例注册bootstrap服务。进入SAMGR_GetInstance(),在foundation\distributedschedule\services\samgr_lite\samgr\source\samgr_lite.c文件中:bootstrap_service是第一个调用SAMGR_GetInstance()的服务。此时全局变量g_samgrImpl还没有初始化,所以需要先进行init,然后才能将实例返回给Bootstrap注册服务。broadcast_service和hiview_service初始化时,可以直接获取实例进行注册。全局变量g_samgrImpl记录了向其注册的所有服务的信息,包括一组四个函数:GetName/Initialize/MessageHandle/GetTaskConfig,也就是上面提到的“boostrap识别的入口函数”。bootstrap_service、broadcast_service、hiview_service只能在SYS_INIT(service)这一步做很简单的注册服务,否则后面的INIT会被阻塞。在SAMGR_Bootstrap();这一步,SAMGR实际上会根据g_samgrImpl中注册的信息,为注册的服务一个一个创建和分配资源,InitializeAllServices,AddTaskPool,SAMGR_StartTaskPool,SAMGR_SendSharedDirectRequest等系统调度,然后在HandleInitRequest中实际调用各个serviceice注册的Initialize接口完成服务的启动,为系统提供服务。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区

最新推荐
猜你喜欢