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

news2024/11/17 7:37:04

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 持续更新中……

移植概述

本文面向希望将 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
    
    
  2. 配置树莓派内核编译环境。

    # 进入树莓派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
    
    
  3. 注释掉 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。

移植内核态必选特性 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 工具 。

  1. 先在树莓派里新建 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
  1. 修改文件执行权限。
        chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest
  1. 开始测试。
        ./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)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

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

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

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

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

相关文章

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠,那么将他们的 值相加作为节点合并后的新值,否则不为 NUL L…

如何选择主数据管理系统平台

企业数据量呈现爆炸式增长,多系统并存、数据分散的现象日益普遍。主数据管理(MDM)作为确保企业核心业务数据准确、一致、完整的关键环节,对于企业的决策制定、业务流程优化和数据分析至关重要。而选择一个合适的主数据管理系统平台…

Vivado时序报告之CDC详解大全

目录 一、前言 二、Report CDC 2.1 Report CDC 2.2 配置界面 2.3 CDC报告 2.3.1 General Information 2.3.2 Summary 2.3.3 CDC Details 2.4 Waiver 2.4.1 设置Waiver 2.4.2 报告查看 2.4.3 去除Waiver设置 三、工程设计 四、参考资料 一、前言 前面已经针对…

别再使用[]来获取字典的值了,来尝试一下这些方法

字典 在Python中,字典(Dictionary)是一种非常灵活的数据结构,用于存储键值对(key-value pairs)。每个键都是唯一的,并且与某个值相关联。字典是Python中处理映射关系(即一个键对应一…

使用VBA快速将文本转换为Word表格

Word提供了一个强调的文本转表格的功能,结合VBA可以实现文本快速转换表格。 示例文档如下所示。 现在需要将上述文档内容转换为如下格式的表格,表格内容的起始标志为。 示例代码如下。 Sub SearchTab()Application.DefaultTableSeparator "*&quo…

综合业务区的数字化创新与智能化蓝图

数字化智能管理的关键要素之一是综合业务区的电子标签系统,该系统在提高管理工作的效率、精确跟踪资源以及改善业务流程中扮演了至关重要的角色。以下内容将对这一综合业务区采用的智能电子标签系统进行深入剖析。 一、定义与功能 1.1定义 融合多功能于一体的智能…

Prometheus+Grafana+elasticsearch_exporter监控elasticsearch的简单配置过程

一、elasticsearch集群配置 elasticsearch的docker方式安装及golang1.22版本使用elasticsearch7的示例代码-CSDN博客 查找“创建elasticsearch集群”标题即可 服务器集群ip地址:192.168.137.21,192.168.137.22,192.168.137.23 二、启动Pr…

《自控》误差传递函数、稳态误差、0型、I型、II型系统

本文关键词: 误差传递函数、laplace终值定理、稳态误差、系统型别(0型、I型、II型系统) 目录 1、求误差传递函数 2、求稳态误差 2.1 Laplace终值定理的使用条件 3、系统型别(I型、II型、III型系统) 1、求误差传递…

IPEmotion 2024 R2现支持Amazon S3和Windows SMB服务器

新版IPEmotion 2024 R2软件推出了许多新功能,其中的一大功能是支持Amazon S3、Windows SMB服务器以及新的IPE-CAM-007 USB摄像头。IPEmotion 2024 R2还支持直接写入TEDS数据和配置可装载电池的新款IPE833记录仪。 — 创新成果一览 — ■ 支持Amazon S3、Windows SM…

甄选范文“论软件可靠性设计技术的应用”,软考高级论文,系统架构设计师论文

论文真题 随着软件的日益普及,系统中软件成分不断增加,使得系统对软件的依赖越来越强。软件的可靠性对系统可靠性的影响越来越大。而实践证明,保障软件可靠性最有效、最经济、最重要的手段是在软件设计阶段采取措施进行可靠性控制,为此提出了软件可靠性设计的概念。 软件可…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

Chainlit集成LlamaIndex实现知识库高级检索(路由检索器)

检索原理 llamaindex 是一个用于构建和部署基于文档的问答系统的框架。其中,RouterRetriever 是一个特定的检索器组件,它设计用于根据输入查询选择最佳的检索策略。RouterRetriever 的主要功能是在多个不同的检索器之间进行路由,根据输入的特…

STM32单片机编程调试常见问题(一) HardFault_Handler故障分析与解决

文章目录 一.概要二.什么是Hard fault三.Hard fault 产生的原因分析四.制作一个Hard fault程序并定位出问题原因1.查看堆栈指针SP的地址以及内容2.找到Return address地址3.查看汇编界面4.输入Return address地址,查找到问题代码 小结 一.概要 在嵌入式开发中&…

AR传送门+特定区域显示内容+放大镜 效果着色器使用

AR传送门特定区域显示内容放大镜 效果 关键词:Portal Mask 1、教程链接: AR 传送门教程 Unity - Portal Mask Implementation - Part 4_哔哩哔哩_bilibili 应用案例效果: 2、案例下载地址:使用unity 2021.3.33f1 obi 工具…

三分钟让你掌握PDF转音频:PDF2Audio背后的秘密

你有没有过这样的经历?工作繁忙,眼睛被一份又一份的PDF文件轰炸,盯得头昏眼花,却还得继续阅读。如果我告诉你,有一个简单的工具,可以把那些厚厚的PDF文档变成语音,让你在通勤、做家务时“听”文件,而不是“看”文件,你会不会心动? 今天,我们就来聊聊一个叫做PDF…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

交通 | ACM SIGSPATIAL 24 深度强化学习求解多周期设施选址问题

论文作者信息:Changhao Miao, Yuntian Zhang, Tongyu Wu, Fang Deng, and Chen Chen. 2024. Deep Reinforcement Learning for Multi-Period Facility Location: p k p_{k} pk​-median Dynamic Location Problem. In The 32nd ACM International Conference on Ad…

如何评估和观测 IoTDB 所需的网络带宽?

IoTDB 推荐网络配置监控网络 I/O 一网打尽! 网络数据传输速度太慢?延迟太高? 网络的硬件配置如何确定? 网络流量过大导致拥塞? 在现代计算机系统和应用程序中,网络 I/O 性能是决定整体系统表现的关键因素之…

微服务 OpenFeign 解析部署使用全流程

目录 1、什么是OpenFeign 1、Feign是什么??http请求 2、OpenFeign是什么 3、Feign和openFeign有什么区别 2、应用 1、 需要开启nacos 和redis 2、准备工作 【1.对springsession做改动】 【2.对springsession-1做改动】 3、实现http请求管理 4、…

借助spring的IOC能力消除条件判断

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen 在前边讲到了如何借助HashMap、枚举类、switch-case消除条件判断,这里讲到我们最常见的用spring的IOC能力来消除代码中的逻辑判断。其实大部…