启动System Init进入OpenHarmony系统过程分析与适配
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": []
},
... ...
]
}
]
}