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 1月 18 00:02 applications
drwxrwxr-x 6 bigdark bigdark 4.0K 1月 18 00:03 arkcompiler
drwxrwxr-x 26 bigdark bigdark 4.0K 1月 18 00:03 base
drwxrwxr-x 20 bigdark bigdark 4.0K 1月 18 00:03 build
lrwxrwxrwx 1 bigdark bigdark 28 1月 18 00:03 build.py -> build/build_scripts/build.py
lrwxrwxrwx 1 bigdark bigdark 28 1月 18 00:03 build.sh -> build/build_scripts/build.sh
drwxrwxr-x 7 bigdark bigdark 4.0K 1月 18 00:03 commonlibrary
drwxrwxr-x 14 bigdark bigdark 4.0K 1月 18 00:03 developtools
drwxrwxr-x 5 bigdark bigdark 4.0K 1月 18 00:03 device
drwxrwxr-x 6 bigdark bigdark 4.0K 1月 18 00:04 docs
drwxrwxr-x 3 bigdark bigdark 4.0K 1月 18 00:04 domains
drwxrwxr-x 7 bigdark bigdark 4.0K 1月 18 00:04 drivers
drwxrwxr-x 19 bigdark bigdark 4.0K 1月 18 00:05 foundation
drwxrwxr-x 3 bigdark bigdark 4.0K 1月 18 00:05 ide
drwxrwxr-x 4 bigdark bigdark 4.0K 1月 18 00:05 interface
drwxrwxr-x 6 bigdark bigdark 4.0K 1月 18 00:06 kernel
drwxrwxr-x 10 bigdark bigdark 4.0K 1月 18 00:06 napi_generator
drwxrwxr-x 3 bigdark bigdark 4.0K 1月 18 00:06 productdefine
lrwxrwxrwx 1 bigdark bigdark 28 1月 18 00:10 qemu-run -> vendor/ohemu/common/qemu-run
drwxrwxr-x 5 bigdark bigdark 4.0K 1月 18 00:06 test
drwxrwxr-x 116 bigdark bigdark 4.0K 1月 18 00:10 third_party
drwxrwxr-x 5 bigdark bigdark 4.0K 1月 18 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.ninja
24 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.gz
tar -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
参考资料
- https://gitee.com/openharmony/manifest/tree/OpenHarmony-v5.0.0-Release/
- https://blog.csdn.net/bigdarknote/category_12749198.html
- https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/quick-start/quickstart-pkg-3861-tool.md