OH隔离核心

Ethereal Lv4

预编译

首先编译一次oh完整镜像,细节可以参考OpenHarmony编译环境搭建 (兼容至4.0-Master和主干分支) - 文章 OpenHarmony开发者论坛

编译结束后在out/rk3568/packages/phone/images下得到所有的镜像,包括如下镜像:

1
2
boot_linux.img  config.cfg      MiniLoaderAll.bin  ramdisk.img   sys_prod.img  uboot.img    userdata.img
chip_prod.img eng_system.img parameter.txt resource.img system.img updater.img vendor.img

注意:

  1. 可以使用docker镜像swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2

  2. 当执行./build.sh时,执行以下命令

1
./build.sh --product-name rk3568 --ccache --gn-args enable_notice_collection=false --gn-args load_test_config=false --gn-flags="--export-compile-commands" --target-cpu arm64 --build-target images 

修改内核

当编译完成后,在目录下会生成out文件夹,编辑out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi

(此文件受kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch预控制,当执行完一轮完整编译后,此patch已经打入此文件,而之后的步骤不涉及重新打patch,因此可以直接修改)

修改dtsi文件中的cmdline,前几行如下所示,在cmdline后加isolcpus=3表示隔离第3个核心(从0计数)

1
2
3
4
5
6
7
8
9
10
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2020 Rockchip Electronics Co., Ltd.
*
*/

/ {
chosen: chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 ohos.boot.eng_mode=on root=PARTUUID=614e0000-0000 hardware=rk3568 default_boot_device=fe310000.sdhci rw rootwait isolcpus=3 ohos.required_mount.system=/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro,barrier=1@wait,required ohos.required_mount.vendor=/dev/block/platform/fe310000.sdhci/by-name/vendor@/vendor@ext4@ro,barrier=1@wait,required ohos.required_mount.misc=/dev/block/platform/fe310000.sdhci/by-name/misc@none@none@none@wait,required ohos.required_mount.bootctrl=/dev/block/platform/fe310000.sdhci/by-name/bootctrl@none@none@none@wait,required";
};

编译内核

进入目录out/kernel/src_tmp/linux-5.10,执行下列命令编译

1
2
3
4
5
export PRODUCT_COMPANY=hihope
export DEVICE_COMPANY=rockchip
export DEVICE_NAME=rk3568
export KBUILD_OUTPUT=../../OBJ/linux-5.10/
./make-ohos.sh TB-RK3568X0

其中./make-ohos.sh TB-RK3568X0默认会指定编译架构为arm64,因此能够读取到上述的dtsi文件的修改

编译输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
make[1]: Entering directory '/root/ssd/openharmony/dayu200/4/out/kernel/OBJ/linux-5.10'
GEN Makefile
drivers/hdf/khdf/model/audio/Kconfig:96:warning: ignoring type redefinition of 'DRM_DW_HDMI_I2S_AUDIO' from 'tristate' to 'bool'
drivers/hdf/khdf/model/network/wifi/bus/Kconfig:25:warning: defaults for choice values not supported
drivers/hdf/khdf/model/network/wifi/bus/Kconfig:32:warning: defaults for choice values not supported
arch/arm64/configs/rockchip_linux_defconfig:2619:warning: override: reassigning to symbol TUN
#
# No change to .config
#
make[1]: Leaving directory '/root/ssd/openharmony/dayu200/4/out/kernel/OBJ/linux-5.10'
make[1]: Entering directory '/root/ssd/openharmony/dayu200/4/out/kernel/OBJ/linux-5.10'
GEN Makefile
DESCEND bpf/resolve_btfids
CALL /root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/scripts/atomic/check-atomics.sh
CALL /root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/scripts/checksyscalls.sh
DTC arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dtb
/root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-toybrick.dtsi:1411.16-1419.4: Warning (i2c_bus_reg): /i2c@fe5a0000/gt1x@14: I2C bus unit address format error, expected "5d"
also defined at /root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0.dtsi:352.7-354.3
also defined at /root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-toybrick-mipi-tx0-beiqicloud.dtsi:326.16-335.4
/root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi:1901.18-1916.6: Warning (graph_port): /hdmi@fe0a0000/ports/port: graph node unit address error, expected "0"
CHK include/generated/compile.h
fatal: not a git repository (or any parent up to mount point /root)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
/root/ssd/openharmony/dayu200/4/out/kernel/src_tmp/linux-5.10/drivers/hdf/khdf/Makefile:19: PRODUCT_PATH=vendor/hihope/rk3568
HCS_DIR = /root/ssd/openharmony/dayu200/4/vendor/hihope/rk3568/hdf_config/khdf/hdf_test
E/write_index_tbl(1475): try to write index table...
E/write_index_tbl(1483): write_index_tbl 3

E/write_index_tbl(1498): try to write index entry(./arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dtb)...
E/write_index_tbl(1515): mod fdt path:./arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dtb -> rk-kernel.dtb...
E/write_index_tbl(1498): try to write index entry(logo.bmp)...
E/write_index_tbl(1498): try to write index entry(logo_kernel.bmp)...
Image: resource.img (with rk3568-toybrick-x0-linux.dtb logo.bmp logo_kernel.bmp) is ready
make[1]: Leaving directory '/root/ssd/openharmony/dayu200/4/out/kernel/OBJ/linux-5.10'

其中会有git报错fatal: not a git repository not a git repository (or any parent up to mount point /root)没有影响,编译时间很短

1
2
3
real    0m3.528s
user 0m16.580s
sys 0m5.822s

当编译结束后,会生成如下两个文件

1
2
out/kernel/src_tmp/linux-5.10/boot_linux.img
out/kernel/OBJ/linux-5.10/resource.img

将两个文件与之前编译得到的镜像一同打包烧写到板子上即可。

查看隔离情况

执行cat /proc/cmdline来获取cmdline参数。

执行ps -o pid,psr,comm -e获取运行核心情况,第二列PSR即为正在运行的核心。

参考

OpenHarmony编译环境搭建 (兼容至4.0-Master和主干分支) - 文章 OpenHarmony开发者论坛

IPADS-Gitlab编译步骤参考

support A/B partition startup · Pull Request !253 · OpenHarmony/kernel_linux_patches - Gitee.com

OpenHarmony内核学习[1]–单独编译OpenHarmony标准系统内核_鸿蒙社区的技术博客_51CTO博客

gitee.com/openharmony/kernel_linux_patches/raw/2d27fcaab23515d5325da7d17c2fd46af72a7f3e/linux-5.10/rk3568_patch/kernel.patch

  • Title: OH隔离核心
  • Author: Ethereal
  • Created at: 2024-05-08 16:31:09
  • Updated at: 2024-05-08 17:41:50
  • Link: https://ethereal-o.github.io/2024/05/08/OH隔离核心/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments