一种快速移植 OpenHarmony Linux 内核的方法

news2025/2/26 3:35:57

移植概述

本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者,介绍一种借助三方芯片平台自带 Linux 内核的现有能力,快速移植 OpenHarmony 到三方芯片平台的方法。

移植到三方芯片平台的整体思路

内核态层和用户态层

为了更好的解释整个内核移植,首先需要介绍一些概念:
我们可以把 OpenHarmony 简单的分为
OpenHarmony = OpenHarmony 内核态层 + OpenHarmony 用户态层

其中 OpenHarmony 内核层就是上图的紫色部分,可以看到,它主要由内核本身(如 Linux Kernel,LiteOS),和一些运行在内核态的一些特性组成,比如 HDF 等。
而 OpenHarmony 用户态层,在上图,就是紫色之外的部分。可以看到,由下往上看,它主要由系统服务层,框架层,应用层组成。在这儿我们将这三层整体称为“OpenHarmony 用户态层”。
为什么这么区分呢?因为我们这篇文章主要是要讨论如何快速的把 OpenHarmony 移植到三方芯片平台上。而 OpenHarmony 的用户态层,整体来说和三方芯片平台的耦合度不高,移植较为方便。而内核态层中的内核本身以及 HDF 驱动框架等,和三方芯片平台的耦合度较高,是移植的重难点。我们先做这个区分,就是为了先把聚光灯打到我们最需要关注的 OpenHarmony 内核态层上,开始分析和解题。另外说明,本文只包含 Linux 内核的快速移植,不包含 LiteOS 的移植。

获得内核态层的两种方法

为了表述方便,我们在下文部分地方用“OH”代替“OpenHarmony”。
将 OH 内核态层继续分解
OH 内核态层 = OH Linux 内核 + OH 内核态特性(可选特性或者必选特性,如必选特性 HDF,今后的可选特性 HMDFS 等)
而 OH Linux 内核 = 标准 LTS Linux 内核 + 三方 SoC 芯片平台代码 + OH 内核态基础代码(支撑 OH 用户态层运行的最基础代码)
因此 OH 内核态层 = 标准 LTS Linux 内核 + 三方 SoC 芯片平台代码 + OH 内核态基础代码 + OH 内核态特性(如 HDF)

而将前两项组合,标准 LTS Linux 内核 + 三方 SoC 芯片平台代码,其实就是一个三方 Linux 内核的基础组成。从上面的推导可以看出,OpenHarmony 内核态层其实能够由两种方法得到:
方法一:OH 内核态层 = 三方 Linux 内核 + OH 内核态基础代码 + OH 内核态特性(如 HDF,今后的 HMDFS 等)
也就是直接借助三方 Linux 内核,再加上基础 OH 内核态基础代码、以及 HDF 等 OH 内核态特性。
方法二:OH 内核态层 = OH Linux 内核 + OH 内核态特性(如 HDF,今后的 HMDFS 等)
也就是直接采用 OHLinux 内核,然后再加入 OH 的其他内核态特性。
当前方法二中 OHLinux 内核支持的三方芯片平台还不够丰富。为了能够响应三方开发者快速移植 OpenHarmony 的要求,下文会着重介绍方法一,即借助三方已有的 Linux 内核,来快速移植 OpenHarmony。

借助已有 Linux 内核来移植 OpenHarmony 的流程

整个移植流程可以分为三步:

  1. 准备整体构建环境,包括将三方芯片平台的现有内核代码拷贝到 OpenHarmony 的整体编译环境下。
  2. OpenHarmony 内核态基础代码的移植。
  3. OpenHarmony 内核态必选特性(如 HDF 等)的移植。
    详细步骤在接下来的章节中介绍。

移植到三方芯片平台的步骤

下面以树莓派 3b (BCM2837) 为例,演示将 OpenHarmony 移植到树莓派的过程。

准备整体构建环境

  1. 将三方内核纳入 OpenHarmony 编译环境。
    完整编译过一遍标准 Hi3516DV300 的内核之后,clone 树莓派内核源码并复制到 manifest 输出目录下:
    export PROJ_ROOT=[OpenHarmony manifest]
    git clone https://gitee.com/xfan1024/oh-rpi3b-kernel.git
    cp -r oh-rpi3b-kernel $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
  1. 配置树莓派内核编译环境。
    # 进入树莓派kernel目录
    cd out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
    # 配置编译环境,使用工程项目自带的clang
    export PATH=$PROJ_ROOT/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PROJ_ROOT/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH
    export MAKE_OPTIONS="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang"
    export PRODUCT_PATH=vendor/hisilicon/hispark_taurus_linux
  1. 注释掉 clang 不识别的 flag。
    PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/arch/arm/Makefile 注释掉以下这一行:
    KBUILD_CFLAGS  +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog

移植内核态基础代码

目前 OpenHarmony 内核态的基础代码,主要是日志服务相关。轻量化内核日志服务代码包含:

drivers/staging/hilog
drivers/staging/hievent

将以上代码,从 OpenHarmony 内核代码目录 kernel/linux/linux-4.19/drivers/staging 中,拷贝到 out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/drivers/staging 下。
在三方内核的 drivers/staging/Kconfig 文件内增加如下代码:

source "drivers/staging/hilog/Kconfig"
source "drivers/staging/hievent/Kconfig"

在三方内核的 drivers/staging/Makefile 文件内增加如下代码:

obj-$(CONFIG_HILOG)             += hilog/
obj-$(CONFIG_HIEVENT)           += hievent/

在内核 config 项中打开对应的 CONFIG 控制宏:CONFIG_HILOG 和 CONFIG_HIEVENT。
具体日志使用说明请参见:Hilog_lite 组件介绍。

移植内核态必选特性 HDF

  1. 打 HDF 补丁。
    在 Linux 内核打 HDF 补丁时,执行补丁 shell 脚本合入 HDF 补丁。

    1. 配置 HDF 补丁脚本的四个变量参数。
    2. 获取 patch_hdf.sh 脚本。
    3. 执行 patch_hdf.sh 脚本依次传入四个变量参数。
      patch_hdf.sh 脚本四个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为内核版本路径,第四个参数是当前设备名。
    ./patch_hdf.sh [工程根目录路径] [内核目录路径] [内核补丁路径] [设备名]
以树莓派 3b 为示例介绍:
    # 进入树莓派kernel目录
    PROJ_ROOT/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh \
    PROJ_ROOT  # 指定工程根目录路径 \
    PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b  # 打补丁的内核目录路径 \
    PROJ_ROOT/kernel/linux/patches/linux-4.19 # 内核补丁路径.\
    hi3516dv300 # 设备名.
  1. 配置 config。
    提供 HDF 基本配置,如果需要其他功能,通过 menuconfig 打开对应驱动开关即可。
    HDF 补丁执行成功后,默认 HDF 开关是关闭的,打开 HDF 基本配置选项如下:
    CONFIG_DRIVERS_HDF=y
    CONFIG_HDF_SUPPORT_LEVEL=2
    CONFIG_DRIVERS_HDF_PLATFORM=y
    CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y
    CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y
    CONFIG_DRIVERS_HDF_PLATFORM_I2C=y
    CONFIG_DRIVERS_HDF_PLATFORM_UART=y
    CONFIG_DRIVERS_HDF_TEST=y
或者通过 menuconfig 界面打开 HDF 相关配置,命令如下:
    # 生成 .config 配置文件
    make ${MAKE_OPTIONS} rpi3b_oh_defconfig
    # 更改HDF内核配置
    make ${MAKE_OPTIONS} menuconfig
    # [*] Device Drivers
    # [*]   HDF driver framework support --->
配置如下(在 Device Drivers -> HDF driver framework support 目录下):

编译 Image

# 执行编译命令
make ${MAKE_OPTIONS} -j33 zImage

编译和运行 HDF 测试用例(可选)

简介
HDF(Hardware Driver Foundation)自测试用例,用于测试 HDF 框架和外设的基本功能,本文主要介绍 HDF 内核态用例测试方法。
预置条件
测试前需要在 menuconfig 里检查 HDF 测试开关 CONFIG_DRIVERS_HDF_TEST=y,代码全量编译通过。
用例编译和测试方法
通过 hdc_std 工具把用例执行文件推送到设备中,然后执行用例即可,操作步骤如下:

  1. 编译 hdf 测试用例。

  2. 用 hdc_std 工具推送测试文件到设备中。

  3. 进入设备 data/test 目录,执行测试文件即可。
    用例编译和测试详细步骤如下:

  4. 编译 hdf 测试用例。
    编译 hdf 测试用例命令和文件路径如下:

    ./build.sh --product-name hispark_taurus_standard --build-target hdf_test
等待编译完成。
  1. 将测试文件移动到目标移植设备上(以树莓派为例)。
    方法一:使用 hdc_std 工具。

  2. 先在树莓派里新建 data/test 目录。

mkdir -p data/test
  1. 推送依赖库和测试用例到树莓派。
hdc file send XXX\out\{device_name}\hdf\hdf\libhdf_test_common.z.so  /system/lib
       hdc file send XXX\out\{device_name}\tests\unittest\hdf\config\hdf_adapter_uhdf_test_config  /data/test
       hdc file send XXX\out\{device_name}\tests\unittest\hdf\devmgr\DevMgrTest  /data/test
       hdc file send XXX\out\{device_name}\tests\unittest\hdf\osal\OsalTest  /data/test
       hdc file send XXX\out\{device_name}\tests\unittest\hdf\sbuf\SbufTest  /data/test
方法二:移动到储存卡内,启动树莓派之后装载。1\. 拔掉树莓派连接电脑的串口、USB 线,然后拔下数据卡。
2\. 将数据卡插入到电脑的读取口,将编译好的 zImage 和测试文件夹 test/下载到电脑,然后移动到数据卡的根目录下。zImage 文件会被替换,请提前做好备份。
3\. 最后将数据卡插回树莓派。
    # 让树莓派文件系统读取储存卡根目录
    mount -t vfat /dev/block/mmcblk0p1 /boot
    cd /boot/[测试文件目录]
    # 允许修改系统文件
    mount -o remount,rw /
    # 安装测试用库
    mv libhdf_test_common.z.so /system/lib
    mkdir /data/test
    mv * /data/test
  1. 执行测试

    1. 进入目录执行测试文件目录 data/test。
cd /data/test
2.  修改文件执行权限。
       chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest
3.  开始测试。
        ./hdf_adapter_uhdf_test_config
        ./DevMgrTest
        ./OsalTest
        ./SbufTest
  1. 如果所有测试文件输出均显示 PASSED,那么 HDF 功能即安装成功。
    示例:DevMgrTest 用例成功结果显示:
./DevMgrTest
Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from DevMgrTest
[ RUN      ] DevMgrTest.DriverLoaderTest_001
[       OK ] DevMgrTest.DriverLoaderTest_001 (0 ms)
[----------] 1 test from DevMgrTest (0 ms total)
[----------] Global test environment tear-down
Gtest xml output finished
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件本地化:步骤、成本和障碍

瓦莱丽娅舍斯托博耶娃,Logrus IT翻译部门的经理,谈论了我们公司的运作方式、软件本地化是什么以及为什么它如此重要。 你能告诉我一些关于你们公司的情况吗,瓦莱丽娅?它做什么,成立多久了? Logrus IT今年…

袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

4月10日,以“DataAI,构建新质生产力”为主题的袋鼠云春季发布会圆满落幕。大会中,袋鼠云带来了一系列“AI”的数字化产品与最新行业沉淀,旨在将数据与AI紧密结合,打破传统的生产力边界,赋能企业实现更高质量…

基于springboot实现音乐网站管理系统项目【项目源码+论文说明】

基于SpringBoot实现音乐网站管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足,创建了一个计算机管理音乐网站的方案。文章介绍了音乐…

【pinia学习】pinia课程学习笔记

课程地址: VUE新一代状态管理工具Pinia超详细基础入门 贴两个链接: vue3官方文档 pinia官方文档 P1 《pinia的简介》 不得不说“开卷有益,学有所获”,前两天自己找pinia的官方文档好像也没找对,原来在vue3官方生态系…

万象皆歌everySings音乐与AI技术的邂逅,内测启动

在这个快节奏的数字时代,音乐依然扮演着连接人心、传递情感的重要角色。然而,音乐创作往往被视为门槛较高的艺术形式,需要复杂的理论知识和漫长的实践经验。但现在,随着人工智能技术的不断进步,让大众对音乐的获悉和交…

消息的可靠性·

面试题:Rabbitmq怎么保证消息的可靠性? 1.消费端消息可靠性保证: 消息确认(Acknowledgements): 消费者在接收到消息后,默认情况下RabbitMQ会自动确认消息(autoAcktrue)。为保证消…

JS加密:对比JScrambler和JShaman加密效果

本文,以一个实例,比对JS加密两大神器:JScrambler、JShaman的加密结果,看看谁的加密效果更好。 注:本文不是技术文章,仅仅从加密结果的“型”上简单观查,不做技术分析,仅看哪个加密代…

【学习笔记】3、逻辑门电路

3.1 MOS逻辑门电路 按照器件结构的不同形式,分为NMOS、PMOS、CMOS三种逻辑门电路。 3.1.1 CMOS CMOS电路成为主导地位的逻辑器件。工作速度:赶上甚至超过TTL电路。(早期CMOS速度慢,后来工艺提升速度变快)功耗和抗干…

【讲解下TypeScript的基础知识点】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

RK3568驱动指南|第二篇 字符设备基础-第15章 文件私有数据实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Logistic 回归为什么适用于二分类问题?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ Logistic 回归非常适用于二分类问题的主要原因在于它的核心机制和输出特性。首先,Logistic 回归模型基于概率的理念,通过 Sigmoid 函数转换输入特征的线性组合,将任意…

windows下安装yolov8环境(详细图文教程)

目录 一:前言 二:安装yolov8 一:前言 最近看了 YOLO 的发展史,发现在机器视觉领域的应用非常广泛,f刚好最近一直在做机器视觉的工作,特此记录下搭建yolov的环境。我们使用的版本是yolov8的就用这个作为演…

【简单讲解下WebSocket】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

OpenHarmony NAPI 框架生成工具实现流程

NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时,底层框架开发者无需关注 Nodejs 语法、C 与 JS 之间的数据类型转换等上层应用转换逻辑,只关注底…

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次,已列入Github官方Trending榜第一位,PaperswithCode热度榜第一位,HuggingFace Spaces趋势榜第一位。项…

Linux之线程互斥与同步

1.线程互斥相关概念 临界资源:多线程执行流共享的资源就叫做临界资源 。 临界区:每个线程内部,访问临界自娱的代码,就叫做临界区。 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临…

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED cubemx基础配置LED 引脚配置按键配置按键引脚配置定时器扫描配置 工程管理配置点亮LED程序设计keil配置与程序下载 参考博文1:STM32 | 利用STM32CubeMX初始化一个STM32工程 参考博文1:点亮LED灯&#x…

PMP考试后多长时间出成绩,如何查询PMP成绩?

PMP考试成绩通常在考试结束后的6—8周左右公布,具体时间取决于PMI的审核时间和发布成绩的流程。PMI也会及时发邮件通知大家。没有及时看到自己成绩的考生,也无需担心,PMP考试成绩发布时间会持续一周左右。如果通过考试,则可以在PM…

TRIZ创新技术的四大分离原理:空间、时间、条件、整体与部分分离

TRIZ创新技术中的四大分离原理是空间分离原理、时间分离原理、条件分离原理和整体与部分分离原理。这些原理是TRIZ理论中的核心组成部分,旨在解决创新过程中遇到的复杂技术问题。 首先,空间分离原理指的是将不同的目标物体或目标属性通过分离它们的空间…

基于Spring Boot+Vue的在线拍卖系统

随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、…