当前位置: 首页 > news >正文

在Ubuntu上从源码编译QEMU 6.2.0,并一键运行OpenHarmony轻量系统(RISC-V版)

从零构建QEMU 6.2.0并运行OpenHarmony轻量系统的实战指南

在探索RISC-V架构与开源操作系统的过程中,能够亲手搭建完整的开发环境并运行一个精简的操作系统内核,是理解计算机系统底层运作的绝佳途径。本文将带你完成从Ubuntu系统上编译QEMU模拟器到启动OpenHarmony轻量系统的全过程,特别针对开发者可能遇到的各种"坑"提供解决方案。

1. 环境准备与依赖管理

在开始编译QEMU之前,确保你的Ubuntu系统(建议20.04 LTS或更高版本)已经更新到最新状态:

sudo apt update && sudo apt upgrade -y

编译QEMU 6.2.0需要安装以下依赖包,这些软件包提供了编译器工具链、库文件和各种开发工具:

sudo apt install -y build-essential zlib1g-dev pkg-config libglib2.0-dev \ binutils-dev libboost-all-dev autoconf libtool libssl-dev \ libpixman-1-dev virtualenv flex bison ninja-build libncursesw5

注意ninja-buildlibncursesw5这两个包经常被遗漏,但它们对后续编译和运行至关重要。如果遇到类似"Could NOT find Ninja"或"libncursesw.so.5: cannot open shared object file"的错误,安装这两个包通常可以解决问题。

提示:对于国内用户,可以考虑更换apt源为国内镜像以加速下载。例如使用阿里云镜像:

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

2. 获取与编译QEMU源码

2.1 下载QEMU 6.2.0源码

有两种主要方式获取QEMU源码:

  1. 直接使用wget下载:
wget https://download.qemu.org/qemu-6.2.0.tar.xz
  1. 从官网下载后上传到服务器:
  • 访问qemu.org/download
  • 找到6.2.0版本下载链接

下载完成后,解压源码包:

tar -xf qemu-6.2.0.tar.xz cd qemu-6.2.0

2.2 配置与编译

创建一个独立的构建目录可以保持源码目录的整洁:

mkdir build && cd build

设置安装目录(建议使用/usr/local/qemu):

QEMU_DST_DIR=/usr/local/qemu sudo mkdir -p $QEMU_DST_DIR

配置编译选项时,可以启用RISC-V支持并优化构建:

../configure --prefix=$QEMU_DST_DIR --target-list=riscv32-softmmu \ --enable-debug --enable-sdl --enable-vnc

关键参数说明

  • --target-list=riscv32-softmmu:专门针对RISC-V 32位架构编译
  • --enable-debug:启用调试支持
  • --enable-sdl:启用图形界面支持

开始编译(根据CPU核心数调整-j参数):

make -j$(nproc)

编译过程可能需要15-30分钟,取决于你的硬件配置。如果遇到错误,常见原因包括:

  • 缺少依赖库:根据错误提示安装相应开发包
  • 权限问题:确保对安装目录有写入权限
  • 内存不足:减少并发编译任务数(如使用-j4代替-j8)

2.3 安装与配置环境变量

编译成功后,安装QEMU到指定目录:

sudo make install

将QEMU添加到PATH环境变量:

echo "export PATH=\$PATH:$QEMU_DST_DIR/bin" >> ~/.bashrc source ~/.bashrc

验证安装是否成功:

qemu-system-riscv32 --version

3. 准备OpenHarmony轻量系统镜像

3.1 获取OpenHarmony源码

参考OpenHarmony官方文档获取4.0 Release版本源码:

repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-4.0-Release --no-repo-verify repo sync -c repo forall -c 'git lfs pull'

3.2 编译RISC-V目标系统

在源码根目录执行:

hb set # 选择qemu_riscv_mini_system_demo hb build

编译完成后,系统镜像将生成在:out/riscv32_virt/qemu_riscv_mini_system_demo/OHOS_Image

4. 使用QEMU运行OpenHarmony

4.1 理解qemu-run脚本

OpenHarmony提供了一个便捷的qemu-run脚本,位于项目根目录。这个脚本实际上是对QEMU命令的封装,主要功能包括:

  • 设置内存大小(默认128MB)
  • 指定CPU类型(riscv32)
  • 加载内核镜像(OHOS_Image)
  • 配置虚拟设备(virtio-net, virtio-blk等)

查看脚本内容:

cat `readlink qemu-run`

4.2 启动系统

直接运行脚本启动系统:

./qemu-run

成功启动后,你将看到类似以下的输出:

[OHOS INFO] [init] init startup... [OHOS INFO] [init] mount partitions... [OHOS INFO] [init] start system services...

4.3 交互与控制

在QEMU交互模式下,可以使用以下快捷键:

  • Ctrl+A然后X:退出QEMU
  • Ctrl+A然后C:进入QEMU监视器控制台
  • Ctrl+Alt+2:切换到QEMU控制台
  • Ctrl+Alt+1:切换回串口输出

5. 常见问题与深度调试

5.1 库文件缺失问题

如果遇到类似以下错误:

error while loading shared libraries: libncursesw.so.5: cannot open shared object file

解决方法:

sudo apt install libncursesw5

5.2 图形界面问题

如果希望启用图形界面显示,可以修改qemu-run脚本,添加:

-display sdl

或者使用VNC连接:

-vnc :1

然后使用vncviewer连接localhost:5901

5.3 调试技巧

要调试OpenHarmony内核,可以在qemu-run脚本中添加:

-s -S

这会让QEMU启动后暂停,等待gdb连接。然后在另一个终端:

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

5.4 性能优化

对于大型项目开发,可以考虑以下优化:

  • 使用ccache加速编译:
    sudo apt install ccache export CC="ccache gcc" export CXX="ccache g++"
  • 在configure时添加--enable-tcg-interpreter提高某些情况下的性能
  • 增加QEMU内存大小(修改qemu-run脚本中的-m参数)

6. 进阶应用与扩展

6.1 添加自定义设备

通过修改QEMU源码可以添加自定义设备。基本步骤:

  1. 在hw/riscv目录下创建新设备代码
  2. 实现必要的MMIO接口
  3. 重新编译QEMU

6.2 多核支持

虽然当前轻量系统是单核的,但QEMU支持多核RISC-V处理器。可以修改启动参数:

-smp 2

6.3 网络配置

要启用网络支持,需要:

  1. 在qemu-run中添加网络设备参数:
    -netdev user,id=mynet -device virtio-net-device,netdev=mynet
  2. 在OpenHarmony内核中启用网络驱动

6.4 存储设备模拟

添加虚拟磁盘:

-drive file=disk.img,if=virtio,format=raw

创建磁盘镜像:

qemu-img create -f raw disk.img 1G

7. 系统开发工作流

7.1 持续开发流程

高效的开发工作流可以这样设置:

  1. 在终端A运行QEMU:
    ./qemu-run -s -S
  2. 在终端B运行gdb:
    riscv32-unknown-elf-gdb out/riscv32_virt/qemu_riscv_mini_system_demo/OHOS_Image
  3. 在终端C进行代码编辑和编译
  4. 通过gdb加载新编译的内核进行测试

7.2 自动化测试

可以编写脚本自动化测试流程:

#!/bin/bash # 编译内核 hb build || exit 1 # 启动QEMU并运行测试 ./qemu-run -nographic -serial mon:stdio <<< "run_tests" # 检查输出是否包含预期结果

7.3 性能分析

使用QEMU内置的性能分析工具:

-perf map

或者使用riscv-profiler等工具分析系统性能。

http://www.jsqmd.com/news/732320/

相关文章:

  • EndNote隐藏玩法:结合Zotero和浏览器插件,打造你的全自动文献流水线
  • Onekey终极教程:3分钟学会免费获取Steam游戏清单的完整指南
  • MicMute终极指南:一键掌控麦克风静音的免费高效工具
  • EasyRAG:轻量级RAG框架快速构建智能知识库应用
  • 2026年5月阿里云Hermes Agent/OpenClaw集成步骤+百炼token Plan配置教程速成
  • 2026年饰品礼盒厂家最新TOP排行,饰品礼盒定做/批发饰品礼盒/饰品礼盒印刷工艺礼盒/服装礼盒 - 品牌策略师
  • 上饶建材AI搜索优化服务商评测:效果与合规双维度解析 - 奔跑123
  • FanControl深度解析:如何让你的电脑风扇从“吵人“变“聪明“的完整指南
  • 旋转编码器实战:从Arduino米思齐到STM32 HAL库,两种消抖方案与代码移植避坑指南
  • 魔兽争霸III终极增强指南:WarcraftHelper插件完全配置教程
  • 别再死记硬背了!一张图看懂Flink SQL滚动、滑动、累积窗口的区别与选型
  • 深度解析|MiniMax M2.7:开启模型自我进化的 Agent 旗舰,重新定义国产大模型天花板
  • BitNet b1.58-2B-4T-GGUF一文详解:GGUF格式适配、bitnet.cpp编译与加载逻辑
  • 国内外AI大模型对比
  • ARM内存屏障详解:DMB、DSB、ISB作用解析
  • yolov26模型训练(使用yolov5样本训练)
  • 五分钟 带你认识 AI 时代的 nodejs 与 包管理工具
  • WzComparerR2完整指南:解密冒险岛WZ文件的终极工具
  • 从电路到代码:零极点分析如何帮你避开运放振荡、设计出更稳的滤波器?
  • RTAB-Map完整指南:如何用开源SLAM技术解决机器人导航难题
  • 终极Windows依赖库管理指南:如何一键解决所有Visual C++运行库问题
  • 如何高效使用Uni-Mol:药物研发的终极3D分子分析指南
  • 把 SAP Cryptographic Library 放对地方,SECUDIR 配对位置,SNC 才不会在运行时掉链子
  • 【flutter for open harmony】第三方库Flutter 鸿蒙版 优惠券展示 实战指南(适配 1.0.0)✨
  • 从JDK8到JDK17:Atomic与LongAdder的演进与最佳实践避坑指南
  • 别再到处找驱动了!STM32CubeMX安装后,CH340和ST-LINK驱动一键搞定指南
  • MuJoCo接触力学终极指南:从滑动问题到稳定仿真的完整解决方案
  • Phi-3-Mini-128K企业实操:将内部SOP文档注入对话系统实现零样本流程咨询
  • PWM触发ADC采样?深入浅出解析汽车ECU中硬件触发的ADC应用与优化技巧
  • VisualCppRedist AIO:告别DLL地狱,一站式解决VC++运行库依赖难题