OpenHarmony——分区切换之reboot源码解析 原创 精华
作者:曹芝展
简介
系统在执行升级操作时,执行指令reboot updater,对misc分区写入相关信息,然后重启系统进行分区切换操作,加载updater分区并执行OTA升级,本文仅介绍reboot的操作原理,以下内容主要基于v3.0-Release版进行分析。
代码路径
目录结构
init_cmd_reboot.c文件位于init组件中,init组件负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。
流程图
源码解读
1.init_cmd_reboot.c文件的main函数
在命令行输入reboot updater指令,会调用到下面的函数中:
main函数中主要作用是识别reboot指令,执行DoReboot操作。
2.DoReboot函数中的libuv库
将SystemSetParameter函数展开,其最终调用到了StartRequest,我们来看下StartRequest:
实际上是通过StartRequest函数是通过libuv库的pipe管道拉起了sys.powerctrl服务之后,再通过该服务调用到具体的do reboot操作。
备注:libuv是一个高性能事件驱动库,屏蔽了各种操作系统的差异从而提供了统一的API。libuv严格使用异步、事件驱动的编程风格。其核心工作是提供事件循环及基于 I/O或其他活动事件的回调机制。libuv库包含了诸如计时器、非阻塞网络支持、异步文件系统访问、线程创建、子进程等核心工具,关于libuv库的详细内容此次不做详解。
3.真正的DoReboot函数
4.DoRebootCore函数中区分shutdown/upadter
若是shutdown指令则直接关机,updater指令则需更新信息到misc分区中,然后再重启系统。
5.UpdateUpdaterStatus函数
(1) miscFile的文件路径需根据实际的文件路径进行修改;
(2) RBMiscReadUpdaterMessage根据miscFile的路径去获取misc文件的信息,一般情况下会是空的,因为并没有写入什么信息进去;
(3) 拼接boot_updater字符串,放到msg的command字段;
(4) RBMiscWriteUpdaterMessage函数将上文拼接的boot_updater字符串写入到misc文件中去;
至此我们的misc文件中保存着boot_updater的信息,在系统启动时切换分区会用到该信息。
执行效果
在命令行中输入指令reboot updater,相关日志如下:
总结
本文仅介绍了在升级时执行reboot updater指令关机之前的一些流程和源码,除了需要向misc分区写入关键信息之外还需要关闭服务和卸载分区,另外需注意根据板子中misc文件的实际位置去修改msicfile变量的路径,重启之后的详细流程将放到下一篇讲解。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
成为大佬之路从读老师的原理进行解读开始!
谢谢分享,学到了
非常感谢分享,学到了学到了