【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行

news/2025/1/20 3:43:07/

OpenHarmony LiteOS-M基于Qemu RISC-V运行

  • 系列文章目录
  • 更新日志
  • OpenHarmony技术架构
    • OH技术架构
    • OH支持系统类型
      • 轻量系统(mini system)
      • 小型系统(small system)
      • 标准系统(standard system)
  • 简介
  • 环境准备
    • 安装QEMU
    • 其他
  • 代码
  • 预编译
  • 编译
    • 编译前注意事项
    • 执行编译
    • 编译产物
  • 在Qemu中运行OHOS_Image镜像
    • 不开启gdb调试
    • 开启gdb调试
    • gdb 运行
  • FAQ
    • [OHOS ERROR] ccache: error: Could not find compiler "riscv32-unknown-elf-gcc" in PATH
    • riscv32-unknown-elf-gdb: error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory
  • 参考资料


系列文章目录

【鸿蒙】0x00-OpenHarmony-4.1-Release DAYU200 RK3568开发环境总结(长文版)
【鸿蒙】0x01-LiteOS-M基于Qemu Arm Cortex-m55运行
【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行


更新日志

日期变更内容
2025-01-17完成OpenHarmony轻量系统基于RISCV编译运行第一版

OpenHarmony技术架构

OH技术架构

OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的组件。OpenHarmony技术架构如下所示:
在这里插入图片描述

  • 内核层

内核子系统:采用多内核(Linux内核或者LiteOS)设计,支持针对不同资源受限设备选用适合的OS内核。内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。

驱动子系统:驱动框架(HDF)是系统硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。

  • 系统服务层

系统服务层是OpenHarmony的核心能力集合,通过框架层对应用程序提供服务。该层包含以下几个部分:

系统基本能力子系统集:为分布式应用在多设备上的运行、调度、迁移等操作提供了基础能力,由分布式软总线、分布式数据管理、分布式任务调度、公共基础库、多模输入、图形、安全、AI等子系统组成。

基础软件服务子系统集:提供公共的、通用的软件服务,由事件通知、电话、多媒体、DFX(Design For X) 等子系统组成。

增强软件服务子系统集:提供针对不同设备的、差异化的能力增强型软件服务,由智慧屏专有业务、穿戴专有业务、IoT专有业务等子系统组成。

硬件服务子系统集:提供硬件服务,由位置服务、用户IAM、穿戴专有硬件服务、IoT专有硬件服务等子系统组成。

根据不同设备形态的部署环境,基础软件服务子系统集、增强软件服务子系统集、硬件服务子系统集内部可以按子系统粒度裁剪,每个子系统内部又可以按功能粒度裁剪。

  • 框架层

框架层为应用开发提供了C/C++/JS等多语言的用户程序框架和Ability框架,适用于JS语言的ArkUI框架,以及各种软硬件服务对外开放的多语言框架API。根据系统的组件化裁剪程度,设备支持的API也会有所不同。

  • 应用层

应用层包括系统应用和第三方非系统应用。应用由一个或多个FA(Feature Ability)或PA(Particle Ability)组成。其中,FA有UI界面,提供与用户交互的能力;而PA无UI界面,提供后台运行任务的能力以及统一的数据访问抽象。基于FA/PA开发的应用,能够实现特定的业务功能,支持跨设备调度与分发,为用户提供一致、高效的应用体验。

OH支持系统类型

轻量系统(mini system)

面向MCU类处理器例如Arm Cortex-M、RISC-V 32位的设备,硬件资源极其有限,支持的设备最小内存为128KiB,可以提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组、传感器设备、穿戴类设备等。

小型系统(small system)

面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为1MiB,可以提供更高的安全能力、标准的图形框架、视频编解码的多媒体能力。可支撑的产品如智能家居领域的IP Camera、电子猫眼、路由器以及智慧出行领域的行车记录仪等。

标准系统(standard system)

面向应用处理器例如Arm Cortex-A的设备,支持的设备最小内存为128MiB,可以提供增强的交互能力、3D GPU以及硬件合成能力、更多控件以及动效更丰富的图形能力、完整的应用框架。可支撑的产品如高端的冰箱显示屏。

简介

Qemu RISC-V虚拟化平台验证的OpenHarmony kernel_liteos_m的代码,目录名为riscv32_virt。 RISC-V 虚拟化平台是一个 qemu-system-riscv32 的目标设备,通过它来模拟一个通用的、基于RISC-V架构的单板。

这次模拟的配置是:RISC-V架构,1个CPU,128M内存。

提示: 系统内存硬编码为128MB。

环境准备

安装QEMU

sudo apt install build-essential zlib1g-dev pkg-config libglib2.0-dev  binutils-dev libboost-all-dev autoconf libtool libssl-dev libpixman-1-dev virtualenv flex bison
  • QEMU获取源码
wget https://download.qemu.org/qemu-6.2.0.tar.xz
  • 编译安装QEMU
tar -xf qemu-6.2.0.tar.xz
cd qemu-6.2.0
mkdir build && cd build
../configure --prefix=qemu_installation_path
make -j16等待编译结束, 执行安装命令:
make install
  • 环境变量
    最后将安装路径添加到环境变量中:
vim ~/.bashrc在~/.bashrc最末尾加入:
export PATH=$PATH:qemu_installation_path

其他

repo、python环境、hb命令安装等, 建议参考: 【鸿蒙】0x00-OpenHarmony-4.1-Release DAYU200 RK3568开发环境总结(长文版)

代码

  • 从版本分支获取源码。可获取该版本分支的最新源码,包括版本发布后在该分支的合入
repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-v5.0.0-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
  • 从版本发布Tag节点获取源码。可获取与版本发布时完全一致的源码。
repo init -u git@gitee.com:openharmony/manifest.git -b refs/tags/OpenHarmony-v5.0.0-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
  • 代码目录
(py3_env) ➜  rv_oh ll
total 76K
drwxrwxr-x   4 bigdark bigdark 4.0K  118 00:02 applications
drwxrwxr-x   6 bigdark bigdark 4.0K  118 00:03 arkcompiler
drwxrwxr-x  26 bigdark bigdark 4.0K  118 00:03 base
drwxrwxr-x  20 bigdark bigdark 4.0K  118 00:03 build
lrwxrwxrwx   1 bigdark bigdark   28  118 00:03 build.py -> build/build_scripts/build.py
lrwxrwxrwx   1 bigdark bigdark   28  118 00:03 build.sh -> build/build_scripts/build.sh
drwxrwxr-x   7 bigdark bigdark 4.0K  118 00:03 commonlibrary
drwxrwxr-x  14 bigdark bigdark 4.0K  118 00:03 developtools
drwxrwxr-x   5 bigdark bigdark 4.0K  118 00:03 device
drwxrwxr-x   6 bigdark bigdark 4.0K  118 00:04 docs
drwxrwxr-x   3 bigdark bigdark 4.0K  118 00:04 domains
drwxrwxr-x   7 bigdark bigdark 4.0K  118 00:04 drivers
drwxrwxr-x  19 bigdark bigdark 4.0K  118 00:05 foundation
drwxrwxr-x   3 bigdark bigdark 4.0K  118 00:05 ide
drwxrwxr-x   4 bigdark bigdark 4.0K  118 00:05 interface
drwxrwxr-x   6 bigdark bigdark 4.0K  118 00:06 kernel
drwxrwxr-x  10 bigdark bigdark 4.0K  118 00:06 napi_generator
drwxrwxr-x   3 bigdark bigdark 4.0K  118 00:06 productdefine
lrwxrwxrwx   1 bigdark bigdark   28  118 00:10 qemu-run -> vendor/ohemu/common/qemu-run
drwxrwxr-x   5 bigdark bigdark 4.0K  118 00:06 test
drwxrwxr-x 116 bigdark bigdark 4.0K  118 00:10 third_party
drwxrwxr-x   5 bigdark bigdark 4.0K  118 00:10 vendor
  • 文件占用空间
(py3_env) ➜  rv_oh du -d1 -h
18G     ./.repo
11G     ./third_party
66M     ./drivers
288K    ./productdefine
669M    ./applications
940M    ./developtools
39M     ./vendor
988K    ./domains
16G     ./prebuilts
12M     ./build
14M     ./commonlibrary
122M    ./interface
445M    ./arkcompiler
1.1G    ./test
2.1G    ./docs
475M    ./base
2.1G    ./foundation
733M    ./device
2.8G    ./kernel
49M     ./napi_generator
2.5M    ./ide
56G

就知道你们喜欢看图片~~
在这里插入图片描述

预编译

下载clang等编译工具链依赖。

bash build/prebuilts_download.sh

效果图:
在这里插入图片描述

编译

编译前注意事项

在开始正式编译之前,建议清空 ~/.ccache 目录, 执行 rm ~/.ccache

  • 开发板: riscv32_virt
  • 内核:liteos_m
  • 产品: qemu_riscv_mini_system_demo

执行编译

  • 在源码所在目录执行
./build.sh --product-name=qemu_riscv_mini_system_demo --device-name=qemu_riscv_mini_system_demo --no-prebuilt-sdk --jobs=4 --ccache
  • 编译过程
[OHOS INFO] [1379/1382] ACTION //build/ohos/packages:packer(//build/lite/toolchain:riscv32-unknown-elf)
[OHOS INFO] [1380/1382] STAMP obj/build/ohos/packages/packer.stamp
[OHOS INFO] [1381/1382] STAMP obj/build/ohos/images/make_images.stamp
[OHOS INFO] [1382/1382] STAMP obj/build/core/gn/images.stamp
[OHOS INFO] end hpm command
[OHOS INFO] The run time for _ninja is 59.1 s
[OHOS INFO] start run hpm command
[OHOS INFO] ccache_dir = /home/bigdark/.ccache, ccache_exec = /usr/bin/ccache
[OHOS INFO] --------------------------------------------
[OHOS INFO] ccache summary:
[OHOS INFO] ccache version: 4.5.1
[OHOS INFO] cache hit (direct): 0
[OHOS INFO] cache hit (preprocessed): 0
[OHOS INFO] cache miss: 1091
[OHOS INFO] hit rate: 0.00% 
[OHOS INFO] miss rate: 100.00% 
[OHOS INFO] Cache size (GB): 8.02 / 100.00 (8.02 %)
[OHOS INFO] ---------------------------------------------
[OHOS INFO] end hpm command
[OHOS INFO] start run hpm command
[OHOS INFO] end hpm command
[OHOS INFO] start run hpm command
[OHOS INFO] unrecognized ninja log format, we need # ninja log v5
[OHOS INFO] 
[OHOS INFO] end hpm command
[OHOS INFO] start run hpm command
[OHOS INFO] c targets overlap rate statistics
[OHOS INFO] subsystem           files NO.       percentage      builds NO.      percentage      overlap rate
[OHOS INFO] ability                   21        1.9%          21        1.9%    1.00
[OHOS INFO] arkui                    218        19.7%        218        19.7%   1.00
[OHOS INFO] bundlemanager             19        1.7%          19        1.7%    1.00
[OHOS INFO] commonlibrary              9        0.8%           9        0.8%    1.00
[OHOS INFO] distributeddatamgr         2        0.2%           2        0.2%    1.00
[OHOS INFO] global                    18        1.6%          18        1.6%    1.00
[OHOS INFO] graphic                   24        2.2%          24        2.2%    1.00
[OHOS INFO] hdf                       84        7.6%          84        7.6%    1.00
[OHOS INFO] hiviewdfx                 12        1.1%          12        1.1%    1.00
[OHOS INFO] kernel                    68        6.2%          68        6.2%    1.00
[OHOS INFO] startup                   26        2.4%          26        2.4%    1.00
[OHOS INFO] systemabilitymgr          15        1.4%          15        1.4%    1.00
[OHOS INFO] thirdparty               554        50.2%        554        50.2%   1.00
[OHOS INFO] 
[OHOS INFO] c overall build overlap rate: 1.00
[OHOS INFO] 
[OHOS INFO] 
[OHOS INFO] end hpm command
[OHOS INFO] qemu_riscv_mini_system_demo build success
[OHOS INFO] Cost Time:  0:01:08
=====build  successful=====
2025-01-18 00:59:40
++++++++++++++++++++++++++++++++++++++++
  • 给你配个图
    在这里插入图片描述

编译产物

构建会产生 OHOS_Image 的镜像文件,在构建完成之后,对应的镜像文件在如下目录:

out/riscv32_virt/qemu_riscv_mini_system_demo
  • 文件目录结构展示
(py3_env) ➜  out tree -L 3            
.
├── hb_args
├── ohos_config.json
├── preloader
│   └── qemu_riscv_mini_system_demo
│       ├── build_config.json
│       ├── build_gnargs.prop
│       ├── build.prop
│       ├── compile_env_allowlist.json
│       ├── compile_standard_whitelist.json
│       ├── exclusion_modules.json
│       ├── features.json
│       ├── mini_system
│       ├── parts_config.json
│       ├── parts.json
│       ├── platforms.build
│       ├── subsystem_config.json
│       ├── syscap.json
│       ├── system
│       └── SystemCapability.json
└── riscv32_virt└── qemu_riscv_mini_system_demo├── all_parts_host.json├── all_parts_info.json├── args.gn├── arkui├── binary_installed_parts.json├── build.1737131970.3223417.log├── build.1737132046.1569324.log├── build.1737132120.5011375.log├── build_configs├── build.log├── build.ninja├── build.ninja.d├── build.trace.gz├── bundlemanager├── config.gni├── config.h├── data├── error.log├── etc├── gen├── global├── hiviewdfx├── kconfig_env.txt├── kconfig_files.txt├── libs├── NOTICE_FILE├── NOTICE_FILES├── obj├── OHOS_Image├── OHOS_Image.asm├── OHOS_Image.bin├── OHOS_Image.map├── OHOS_Image.sym.sorted├── packages├── sorted_action_duration.txt├── src_installed_parts.json├── src_sa_infos_tmp.json├── startup├── system├── test_info├── thirdparty└── toolchain.ninja24 directories, 39 files

在Qemu中运行OHOS_Image镜像

a) 如果没有安装 qemu-system-riscv32 ,安装请参考链接:安装QEMU

不开启gdb调试

b) 运行

开启gdb调试

在代码所在目录下:

cd device/qemu/riscv32_virt
vim liteos_m/config.gni

board_opt_flags 中的

board_opt_flags = []

编译选项board_opt_flags修改为:

board_opt_flags = [ "-g" ]

在这里插入图片描述
保存并退出,在OHOS根目录重新编译:

./build.sh --product-name=qemu_riscv_mini_system_demo --device-name=qemu_riscv_mini_system_demo --no-prebuilt-sdk --jobs=4 --ccache

gdb 运行

在窗口①中输入命令:

./qemu-run -g会卡主在这里

在这里插入图片描述

在另一个窗口②中输入命令:

riscv32-unknown-elf-gdb out/riscv32_virt/qemu_riscv_mini_system_demo/OHOS_Image
(gdb) target remote localhost:1234
(gdb) b main

详细信息
在这里插入图片描述

同时第一控制台可以看到有窗口①处于运行模式:
在这里插入图片描述

FAQ

[OHOS ERROR] ccache: error: Could not find compiler “riscv32-unknown-elf-gcc” in PATH

参考: 安装riscv-gnu-toolchain交叉编译工具链

Compiler install:gcc_riscv32, Note: Downloadable directly

wget https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gztar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~
cd gcc_riscv32

编辑.bashrc文件, 我的是 .zshrc

vim ~/.bashrc

将以下命令拷贝到.bashrc文件的最后一行,保存并退出。

export PATH=~/gcc_riscv32/bin:$PATH

生效环境变量。

source ~/.bashrc

shell命令行中输入如下命令,如果能正确显示编译器版本号,表明编译器安装成功。

riscv32-unknown-elf-gcc -v		

riscv32-unknown-elf-gdb: error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory


sudo apt install libncursesw5

参考资料

  1. https://gitee.com/openharmony/manifest/tree/OpenHarmony-v5.0.0-Release/
  2. https://blog.csdn.net/bigdarknote/category_12749198.html
  3. https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-3861-tool.md

http://www.ppmy.cn/news/1564571.html

相关文章

深入浅出JSON:数据交换的轻量级解决方案

在现代Web开发中,数据交换是前后端通信的核心。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特点,成为了前后端数据交互的首选格式。本文将详细介绍JSON的定义、数据格式、…

七十五:握手的优化:Session缓存、Ticket票据及TLS 1.3的0-RTT

引言 在现代互联网环境中,安全性和性能是设计网络协议时至关重要的两个方面。传输层安全性(TLS)协议是实现安全传输的关键机制。然而,传统的TLS握手过程虽然安全,但是存在潜在的延迟问题。为了优化握手的效率&#xf…

elementUI项目中,只弹一个【token过期提示】信息框的处理

关键代码 let msgArr document.querySelectorAll(.token401Message)if (!msgArr.length) {Message({customClass: token401Message,message: response.data.msg,type: error,onClose: () > {msgArr []}})} 完整代码 import axios from axios import { getToken } from…

使用 Python 实现自动化办公(邮件、Excel)

目录 一、Python 自动化办公的准备工作 1.1 安装必要的库 1.2 设置邮件服务 二、邮件自动化处理 2.1 发送邮件 示例代码 注意事项 2.2 接收和读取邮件 示例代码 三、Excel 自动化处理 3.1 读取和写入 Excel 文件 示例代码 3.2 数据处理和分析 示例代码 四、综合…

微信小程序:实现单选,多选,通过变量控制单选/多选

一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…

昇腾环境ppstreuct部署问题记录

测试代码 我是在华为昇腾910B3上测试的PPStructure。 import os import cv2 from PIL import Image #from paddleocr import PPStructure,draw_structure_result,save_structure_res from paddleocr_asyncio import PPStructuretable_engine PPStructure(show_logTrue, imag…

[Easy] leetcode-14 最长公共前缀

一、题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"输入&#xff1a;strs [&qu…

springCloudGateway+nacos自定义负载均衡-通过IP隔离开发环境

先说一下想法&#xff0c;小公司开发项目&#xff0c;参考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注册中心&#xff0c;有多个模块&#xff08;每个模块都是一个服务&#xff09;。 想本地开发&#xff0c;…