启动恢复

    • init启动引导

    支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。

    负责处理从内核加载第一个用户态进程开始,到第一个应用程序启动之间的系统服务进程启动过程。启动恢复子系统除负责加载各系统关键进程之外,还需在启动的同时设置其对应权限,并在子进程启动后对指定进程实行保活(若进程意外退出要重新启动),对于特殊进程意外退出时,启动恢复子系统还要执行系统复位操作。

    • appspawn应用孵化

      支持使用LiteOS-A内核的平台,当前包括:Hi3516DV300平台和Hi3518EV300平台。

      负责接受应用程序框架的命令孵化应用进程,设置其对应权限,并调用应用程序框架的入口。

    • bootstrap启动服务模块

      支持使用LiteOS-M内核的平台,当前包括:Hi3861平台。

      提供了各服务和功能的启动入口标识。在SAMGR启动时,会调用boostrap标识的入口函数,并启动系统服务。

    • 系统属性

      支持使用LiteOS-M内核和LiteOS-A内核的平台,包括:Hi3861平台,Hi3516DV300平台,Hi3518EV300平台。

      负责提供获取与设置操作系统相关的系统属性。

      系统属性包括:默认系统属性、OEM厂商系统属性和自定义系统属性。OEM厂商部分仅提供默认值,具体值需OEM产品方按需进行调整,详见“使用”部分。

    表 1 启动恢复源代码目录结构

    启动恢复使用C语言开发。

    • 系统属性:OEM厂商相关仅提供默认值,具体值需产品方按需进行调整。
    • init启动引导的配置文件

    启动引导模块配置文件包含了所有需要由init进程启动的系统关键服务的服务名、可执行文件路径、权限和其他属性信息,该文件位于代码仓库/vendor/huawei/camera/init_configs/目录,部署在/etc/下,文件名称为init.cfg,采用json格式,文件大小目前限制在10KB以内。

    init进程启动后首先读取/etc/init.cfg,然后解析其json内容,并根据解析结果依次加载系统服务。配置文件格式和内容说明如下所示:

    1. "jobs" : [{
    2. "name" : "pre-init", -------- init之前执行的job,可以放置一些启动进程之前的预操作(如新建文件夹等)
    3. "cmds" : [
    4. "mkdir /testdir", -------- 创建文件夹命令,mkdir和目标文件夹之间有且只能有一个空格
    5. "chmod 0700 /testdir", -------- 修改权限命令,chmod 权限 目标 之间间隔有且仅有一个空格,权限必须为0xxxx格式
    6. "chown 99 99 /testdir",-------- 修改属组命令,chown uid gid 目标 之间间隔有且仅有一个空格
    7. "mkdir /testdir2",
    8. "mount vfat /dev/mmcblk0p0 /testdir2 noexec nosuid" -------- mount命令,格式为:mount 文件系统类型 source target flags data
    9. -------- flags当前仅支持nodevnoexecnosuid rdonly,各项均以一个空格分开
    10. ]
    11. }, {
    12. "name" : "init", -------- init进程支持的job名称,如扩展请确保job名称不超过32字节
    13. "cmds" : [ -------- 当前job支持的命令集合,命令名称(10字节以内)和后面参数(32字节以内)之间有且只能有一个空格
    14. "start service2" -------- 当前job的第二条命令(可以根据需要调整命令在数组中的顺序,init进程将根据解析顺序依次执行)
    15. ]
    16. }, {
    17. "name" : "post-init", -------- init之后执行的 job,可以放置一些启动进程之后的操作
    18. "cmds" : []
    19. }
    20. "services" : [{ -------- service集合(数组形式),包含了init进程需要启动的所有系统服务
    21. "name" : "service1", -------- 当前服务的服务名,须确保非空且长度在32字节以内
    22. "path" : "/bin/process1" -------- 当前服务的可执行文件全路径,须确保非空且长度在64字节以内
    23. "uid" : 1, -------- 当前服务进程的uid
    24. "gid" : 1, -------- 当前服务进程的gid
    25. "once" : 0, -------- 当前服务进程是否为一次性进程
    26. 0 --- 当前服务非一次性进程,当进程因任何原因退出时,init收到SIGCHLD信号后将重新启动该服务进程
    27. 0 --- 当前服务为一次性进程,当进程因任何原因退出时,init不会重新启动该服务进程
    28. "importance" : 1, -------- 当前服务是否为关键系统进程
    29. 0 --- 当前服务非关键系统进程,当进程因任何原因退出时,init不会做系统复位操作
    30. 0 --- 当前服务为关键系统进程,当进程因任何原因退出时,init收到SIGCHLD信号后进行系统复位重启
    31. "caps" : [0, 1, 2, 5] -------- 当前服务所需的capability值,根据安全子系统已支持的capability,评估所需的capability,遵循最小权限原则配置
    32. }, {
    33. "name" : "service2", -------- 下一个需要init启动的服务。此处服务的顺序与启动顺序无关,启动顺序取决于上面job中的cmd顺序。
    34. "path" : "/bin/process2",
    35. "uid" : 2,
    36. "gid" : 2,
    37. "once" : 1,
    38. "caps" : [ ]
    39. ]
    40. }

    表 2 cmds支持列表

    命令名称

    命令格式

    命令说明

    start

    start ServiceName 间隔有且仅有一个空格

    mkdir

    mkdir /xxxx/xxx 间隔有且仅有一个空格

    创建目录

    chmod

    chmod 0xxx /xxx/xx 间隔有且仅有一个空格

    修改权限,权限值必须为0xxx格式,如0755,0600等,需要遵循权限最小原则配置

    chown

    chown uid gid /xxx/xx 间隔有且仅有一个空格

    修改属组

    mount

    mount fileSysType source target flags data

    间隔有且仅有一个空格

    挂载命令,其中flags目前仅支持nodev、noexec、nosuid和rdonly,其它字串均判定为data项

    需要注意的是,init.cfg文件的修改需要保持json格式不被破坏,否则init进程解析失败后不会启动任何服务。对于配置的服务权限(uid/gid/capability)需要符合安全子系统要求且遵循权限最小原则。另外,对于once和importance项均为0的服务,若其在4分钟内连续退出次数超过4次,则init将终止重新启动该服务的操作。

    • 系统参数

      • OEM厂商相关系统属性

      Hi3516DV300,Hi3518EV300开发板需要修改vendor/huawei/camera/hals/utils/sys_param目录下源文件:

      Hi3861开发板需要修改vendor/huawei/wifi-iot/hals/utils/sys_param目录下源文件:

      1. static const char HOS_PRODUCT_TYPE[] = {"****"};
      2. static const char HOS_MANUFACTURE[] = {"****"};
      3. static const char HOS_BRAND[] = {"****"};
      4. static const char HOS_MARKET_NAME[] = {"****"};
      5. static const char HOS_PRODUCT_SERIES[] = {"****"};
      6. static const char HOS_PRODUCT_MODEL[] = {"****"};
      7. static const char HOS_SOFTWARE_MODEL[] = {"****"};
      8. static const char HOS_HARDWARE_MODEL[] = {"****"};
      9. static const char HOS_HARDWARE_PROFILE[] = {"aout:true,display:true"};
      10. static const char HOS_BOOTLOADER_VERSION[] = {"bootloader"};
      11. static const char HOS_SECURE_PATCH_LEVEL[] = {"2020-6-5"};
      12. static const char HOS_ABI_LIST[] = {"****"};
      • 获取默认系统属性
      • 设置获取自定义系统属性
      1. const char* defSysParam = "data of sys param ***...";
      2. char key[] = "rw.parameter.key";
      3. char value[] = "OEM-hisi-10.1.0";
      4. int ret = SetParameter(key, value);
      5. char valueGet[128] = {0};

    startup_frameworks_syspara_lite

    startup_hals_syspara_lite

    startup_interfaces_kits_syspara_lite

    startup_appspawn_lite

    startup_services_bootstrap_lite