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

移植概述

本文面向希望将 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 # 设备名.
  2. 配置 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

    等待编译完成。

  5. 将测试文件移动到目标移植设备上(以树莓派为例)。
    方法一:使用 hdc_std 工具。

    1. 先在树莓派里新建 data/test 目录。
      mkdir -p data/test
    2. 推送依赖库和测试用例到树莓派。
      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
  6. 执行测试

    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
    4. 如果所有测试文件输出均显示 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)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

《鸿蒙 (OpenHarmony)开发入门教学视频》

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

曲线降采样之道格拉斯-普克算法Douglas–Peucker

曲线降采样之道格拉斯-普克算法Douglas–Peucker 该算法的目的是,给定一条由线段构成的曲线,找到一条点数较少的相似曲线,来近似描述原始的曲线,达到降低时间、空间复杂度和平滑曲线的目的。 附赠自动驾驶学习资料和量产经验&…

通过提交容器的方式修改ubuntu镜像的apt源

通过提交容器的方式修改ubuntu镜像的apt源 步骤总结 问题,每次创建容器之后,都要在容器内手动更改镜像源。 不如,干脆修改镜像的apt源,一次到位。 步骤 先创建一个容器,到容器内执行变更命令。 D:/sandbox> dock…

【Vue】vue3简介与环境配置

文章目录 项目编码规范什么是 Vue?安装node环境nvm针对node版本惊醒管理的工具 项目编码规范 组合式API Typescript setup(语法糖) 什么是 Vue? Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,…

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目:1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…

docker容器之etcd安装

一、etcd介绍 1、etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 2、etcd特点 简单的接口,通过标准的HTTP API进行调用,也可以使用官方提供的 etcdctl 操作存储的数据。…

1999-2022年上市公司员工人数数据

1999-2022年上市公司员工人数数据 1、时间:1999-2022年 2、指标:证券代码、时间、员工人数 3、来源:整理自csmar 4、范围:上市公司 5、指标解释: 上市公司员工人数是衡量公司规模和发展状的重要指标。该数据直接…

编程新手必看,python中的转义字符及注释!(4)

1、常见的转义字符 Python中的转义字符用于在字符串中表示一些特殊的字符,这些字符通常无法直接输入或具有特殊的意义。以下是一些常见的转义字符及其含义: 在Python中,可以使用转义字符来表示一些特殊的字符。以下是使用转义字符的几种常见…

VuePress基于 Vite 和 Vue 构建优秀框架

VitePress 是一个静态站点生成器 (SSG),专为构建快速、以内容为中心的站点而设计。简而言之,VitePress 获取用 Markdown 编写的内容,对其应用主题,并生成可以轻松部署到任何地方的静态 HTML 页面。 VitePress 附带一个用于技术文档…

Java复习第十六天学习笔记(JSP、Servlet),附有道云笔记链接

【有道云笔记】十六 4.2 JSP、Servlet https://note.youdao.com/s/QccA5g1G 一、软件的结构 C/S (Client - Server 客户端-服务器端) 典型应用:QQ软件 ,飞秋,印象笔记。 特点: 必须下载特定的客户端程序。服务器端升级&#…

保护Android应用安全:全面探究代码混淆在加固中的作用

Android APP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码 使用 ipaguard工具可以对代码进行混淆,使得反编译出来的代码很难阅读和理解&#xff…

CSS面试题---基础

1、css选择器及优先级 选择器优先级:内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意: !important优先级最高; 如果优先级相同,则最后出现的样式生效; 继承得到的样式优先…

腾讯云2024年4月优惠券及最新活动入口

腾讯云是腾讯集团倾力打造的云计算品牌,提供全球领先的云计算、大数据、人工智能等技术产品与服务。为了吸引用户上云,腾讯云经常推出各种优惠活动。本文将为大家分享腾讯云优惠券及最新活动入口,助力大家轻松上云! 一、优惠券领取…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案,然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性(Self-consistency) 多个思维链,然后取…

浪潮分布式存储AS13000G6-M36改扩配后管理界面不能识别和标记硬盘的处理方法

AS13000G6 改配出问题的场景 浪潮分布式存储AS13000G6-M36渠道备货的分布式存储通常是流量机型,实际出货可能会涉及改配 集群部署完以后建议在系统视图下查看一下盘是否能识别 这个是正常的情况,可以正确管理到盘,硬盘侧边有绿色的指示灯。 如图是管理…

如果符合这7点,说明你经历过职场PUA。

今天聊聊在职场中比较普遍,但又容易被忽视的问题——职场PUA。 工作是为了更好的生活,但有时候可能会发现,这份工作怎么越做越不对劲,感觉像是偏航了。 简单来说,职场PUA就是一种精神控制,常常以批评和否…

java的警示之有危险的行为

👨‍💻作者简介:👨🏻‍🎓告别,今天 📔高质量专栏 :☕java趣味之旅 欢迎🙏点赞🗣️评论📥收藏💓关注 💖衷心的希…

MATLAB科研绘图与学术图表绘制从入门到精通

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用

如图所示,今天接收一个项目其中富文本编辑器报错 此项目为vue2项目,富文本编辑器为直接下载好的资源存放在public目录下的 经过排查发现报错的函数在ueditor.all.min.js文件内,但是ueditor.all.min.js文件夹是经过压缩的 所以直接,将index.html中的引用路径修改为ueditor…

C++算法——滑动窗口

一、长度最小的子数组 1.链接 209. 长度最小的子数组 - 力扣(LeetCode) 2.描述 3.思路 本题从暴力求解的方式去切入,逐步优化成“滑动窗口”,首先,暴力枚举出各种组合的话,我们先让一个指针指向第一个&…

“探秘数据结构:栈的奇妙魔力“

每日一言 兰有秀兮菊有芳,怀佳人兮不能忘。 —刘彻- 栈 栈的概念及结构 栈(Stack) :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守…