启动System Init进入OpenHarmony系统过程分析与适配

LAVAL小助手
发布于 2024-1-25 17:00
浏览
0收藏

1 关键字

启动、Init、产品配置、启动配置

2 简要描述

本文档主要以XX开发版为例分析OpenHarmony系统启动过程、产品配置、启动配置,并举例说明如何配置。

  • 内核加载Init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置
  • init进程启动后,会挂载tmpfs,procfs,创建基本的dev设备节点,提供最基本的跟文件系统
  • init也会启动ueventd监听内核热插拔设备事件,为这些设备创建dev设备节点。包括block设备各个分区设备都是通过此事件创建。
  • init进程挂载block设备各个分区(system,vendor)后,开始扫描各个系统服务的init启动脚本,并拉起各个SA服务。
  • samgr是各个SA的服务注册中心,每个SA启动时,都需要向samgr注册,每个SA会分配一个ID,应用可以通过该ID访问SA。
  • foundation是一个特殊的SA服务进程,提供了用户程序管理框架及基础服务。由该进程负责应用的生命周期管理。
  • 由于应用都需要加载JS的运行环境,涉及大量准备工作,因此appspawn作为应用的孵化器,在接收到foundation里的应用启动请求时,可以直接孵化出应用进程,减少应用启动时间。

3 init启动引导组件简要说明

init启动引导组件对应的进程为init进程,是内核完成初始化后启动的第一个用户态进程。init进程启动之后,读取init.cfg配置文件,根据解析结果,执行相应命令并依次启动各关键系统服务进程,在启动系统服务进程的同时设置其对应权限。

  • 每个系统服务启动时都需要编写各自的启动脚本文件init.cfg,定义各自的服务名、可执行文件路径、权限和其他信息
  • 每个系统服务各自安装其启动脚本到/system/etc/init 目录下,init进程统一扫描执行

4 init相关的移植适配、产品配置

4.1 新芯片平台移植

新芯片平台移植时,平台相关的初始化配置需要增加平台相关的初始化配置文件/device/board/[companyName]/{hardware}/cfg/init.{hardware}.cfg (/vendow/etc/init.{hardware}.cfg);该文件完成平台相关的初始化设置,如安装ko驱动,设置平台相关的/proc节点信息

4.1.1 适配文件系统

  • 复制/device/board/hihope/rk3568/cfg/init.rk3568.cfg创建/device/board/[companyName]/{hardware}/cfg/fstab.{hardware}文件
  • 根据{hardware}查找到dts文件:/kernel/linux/linux-5.10/arch/arm/boot/dts/{hardware}*.dts,获取到启动参数bootargs
  • 根据bootargs的值,获取required分区,如(此处用的rk3568的举例):ohos.required_mount.system=/dev/block/platform/fe310000.sdhci/by-name/xxx@/usr@ext4@ro,barrier=1@wait,required
  • 修改fstab.{hardware}文件,删除不需要的分区,修改bootDevice(rk3568的值是fe310000.sdhci,其他平台根据实际值修改)如:
# fstab file.
#<src>                                                  <mnt_point> <type>    <mnt_flags and options>                              <fs_mgr_flags>
/dev/block/platform/fe310000.sdhci/by-name/system               /usr       ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/vendor              /vendor        ext4     ro,barrier=1  wait,required
/dev/block/platform/fe310000.sdhci/by-name/userdata               /data       f2fs     discard,noatime,nosuid,nodev,fscrypt=2:aes-256-cts:aes-256-xts,usrquota  wait,check,fileencryption=software,quota
/dev/block/platform/fe310000.sdhci/by-name/misc           /misc none none wait,required

4.1.2 usb适配

复制/device/board/hihope/rk3568/cfg/init.rk3568.usb.cfg创建/device/board/[companyName]/{hardware}/cfg/init.{hardware}.usb.cfg文件,修改其中sys.usb.controller的值,此值和具体开发板usb硬件有关

  • 进入开发板执行"ls /sys/class/udc",获取值如(此值为rk3568平台的,其他根据实际值替换):fcc00000.dwc3
  • 修改对应cmd,以rk3568为例:“setparam sys.usb.controller fcc00000.dwc3”

4.1.3 内核等适配

  • 复制/device/board/hihope/rk3568/cfg/init.rk3568.cfg创建/device/board/[companyName]/{hardware}/cfg/init.{hardware}.cfg配置文件
  • 根据内核新增模块及适配获取新增的ko列表
  • 根据镜像分区配置文件/build/ohos/images/mkimage/socko_image_conf.txt获取分区:/mnt/socko
  • 根据上述信息,创建目录,挂载分区,载入内核模块,如:
{
    "name" : "fs",
    "cmds" : [
        "mkdir /mnt/socko",
        "mount ext4 /dev/block/platform/{bootDevice}/by-name/socko /mnt/socko wait rdonly barrier=1",
        "insmod /mnt/socko/gpu-***.ko",
        ... ...
    ]
}
  • 其他设备/模块等适配,根据开发版预定义或功能要求来,如rk3568的blue_host,该串口设备在系统中的名字在开发板中预定义为"/dev/ttyS8",也可以在代码中找到:
    /vendor/hihope/rk3568/bluetooth/include/bt_vendor_brcm.h
#define BLUETOOTH_UART_DEVICE_PORT "/dev/ttyS8" /* maguro */

在cfg文件对应的cmd根据设备名修改:

"chown blue_host blue_host /dev/ttyS8",

4.1.4 修改build.gn

复制/device/board/hihope/rk3568/cfg/BUILD.gn创建/device/board/[companyName]/{hardware}/cfg/BUILD.gn,根据{hardware}修改对应配置

4.2 产品配置

  • 产品配置路径:不同设备路径不同,一般规则:/vendor/[companyName]/{hardware}/config.json
  • 产品配置说明举例
    config.json为编译构建的主入口,包含了开发板、OS组件和内核等配置信息,其中各组件及特性需要根据设备需求配置,新增的子系统或模块组件可以配置到此文件中。如果配置到rich.json等将要继承的配置文件也可以起作用,但放到此文件/对应的配置文件更规范。如果不配置新增的子系统或组件,新增的这些就无效。哪些是必须要修改的是根据设备和业务需求来的,比如L1设备,startup子系统的组件就需要选择init_lite,再比如某些厂商提供了适配于开发板的第三方内核,此时就可以以新增子系统或组件的形式移植进Openharmony,然后修改config.json配置文件相关子系统和组件。以rk3568为例,配置如下:
{
  "product_name": "rk3568",     // 产品名称,支持自定义
  "device_company": "rockchip", // 芯片解决方案厂商名称,一般与device的二级目录名称一致
  "device_build_path": "device/board/hihope/rk3568",
  "target_cpu": "arm",
  "type": "standard",        // 设备类型--标准设备
  "version": "3.0",            // OpenHarmony版本号,应与实际下载的版本移植
  "board": "rk3568",        // 开发版名称,与device的三级目录名称一致{hardware}
  "api_version": 8,
  "enable_ramdisk": true,
  "enable_absystem": false,
  "build_selinux": true,
  "build_seccomp": true,
  "inherit": [ "productdefine/common/inherit/rich.json", "productdefine/common/inherit/chipset_common.json" ], //继承其他组件配置信息,和本配置文件合并,如果配置重复,高优先级取代更新低优先级配置,对于服务的cfg配置文件优先级是/system/etc < /system/etc/init < /chipset/etc
  "subsystems": [ // 非通用子系统,应为OS支持的子系统
    {
      "subsystem": "security",
      "components": [ // 产品选择的某个子系统下的组件,应为某个子系统支持的组件
        {
          "component": "selinux_adapter",
          "features": []  // 产品配置的某个组件的特性
        }
      ]
    },
    ... ...
    {
      "subsystem": "hdf",
      "components": [
        {
          "component": "drivers_interface_ril",
          "features": []
        },
        {
          "component": "drivers_peripheral_ril",
          "features":[]
        }
      ]
    },
    ... ...
    {
      "subsystem": "startup", // 配置启动子系统
      "components": [
        {
          "component": "init", // init组件,如果是L1设备选择init_lite
          "features": [
            "enable_ohos_startup_init_feature_ab_partition = true",
            "enable_ohos_startup_init_feature_loader = true"
          ]
        }
      ]
    },
    {
    "subsystem": "product_**", // 如果新增子系统或组件,适配子系统时最好依次添加,确保一个没问题后再加其余的
    "components": [
        {
          "component": "product_a8s",
          "features": []
        },
        ... ...
      ]
    }
  ]
}

启动System Init进入OpenHarmony系统过程分析与适配-鸿蒙开发者社区

收藏
回复
举报
回复
    相关推荐