QEMU 安装与实战教程
前面几期视频,我们介绍了 Linux 与 RISC-V 为什么非常适合结合,也分析了 2026 年 RISC-V Linux 的生态现状。
但很多朋友可能还有一个更实际的问题:
RISC-V Linux 现在究竟能拿来做什么?
普通人有必要购买一块 RISC-V 开发板吗?
如果手里没有 RISC-V 硬件,能不能先在自己的电脑上体验一下?
答案是可以。
我们可以使用一个非常重要的开源工具:QEMU。
通过 QEMU,你可以在普通的 x86 电脑上模拟 RISC-V 处理器,编译并运行 RISC-V 程序。
如果进一步准备 Linux 内核和根文件系统,甚至可以模拟一台完整的 RISC-V 计算机。
今天这期视频,我们先讲 RISC-V Linux 目前最适合的应用方向,然后一步一步安装 QEMU,完成第一个 RISC-V Linux 实验。
第一章:RISC-V Linux 目前最适合做什么?
第一,计算机和处理器教学
RISC-V Linux 目前最有价值的应用之一,就是计算机教学。
学生通常先学习 C 语言。
但是很多人学完 C 语言以后,仍然不知道一行代码究竟是怎样进入 CPU,最后被处理器执行的。
RISC-V 提供了一条非常清晰的学习路线:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
C 语言源代码 ↓ 编译器 ↓ RISC-V 汇编 ↓ RISC-V 机器指令 ↓ Linux 系统调用 ↓ Linux 内核 ↓ 处理器和硬件 |
例如,我们在 C 程序中写下:
|
1 2 |
printf("Hello\n"); |
编译器会把它翻译成 RISC-V 指令。
程序运行时,又会通过 Linux 系统调用,请求内核把文字写到终端。
这样,学生不仅可以学习编程,还可以把编译器、汇编语言、操作系统和处理器架构连接起来。
这比只背诵几条机器指令,更容易理解计算机的完整工作过程。
第二,嵌入式 Linux
RISC-V 也非常适合定制嵌入式系统。
厂商可以设计一颗 RISC-V SoC。
在标准 RISC-V CPU 旁边,再加入不同的专用模块。
例如:
|
1 2 3 4 5 6 7 |
AI 加速器 视频编码器 网络处理器 安全模块 DSP FPGA |
RISC-V CPU 负责控制系统和运行通用程序。
专用模块负责处理计算量特别大的任务。
Linux 则负责设备驱动、内存管理、文件系统、网络通信和应用程序。
这种组合很适合工业控制、网络设备、机器人、智能摄像头和边缘计算设备。
第三,边缘人工智能
在很多边缘设备中,CPU 主要负责:
|
1 2 3 4 5 6 |
系统启动 任务调度 设备控制 数据准备 网络通信 |
真正的矩阵计算,则交给 NPU、GPU、向量单元或者其他专用加速器。
RISC-V 可以承担控制和通用计算。
Linux 则负责驱动、容器、模型部署、网络服务和远程更新。
所以 RISC-V 加 Linux,并不是简单地用 RISC-V CPU 完成所有计算。
它更像是整个 AI 系统的控制中心。
第四,编译器和系统软件研究
RISC-V 的指令集扩展仍然在不断发展。
例如向量扩展、虚拟化扩展、安全扩展,以及各种性能优化扩展。
这为研究人员提供了很多机会。
编译器开发者可以研究:
如何生成更高效的 RISC-V 指令?
Linux 内核工程师可以研究:
如何支持新的内存管理、中断和虚拟化功能?
处理器研究人员也可以比较:
不同流水线、缓存和分支预测设计,会对 Linux 性能产生什么影响?
所以对于编译器、操作系统、虚拟化和体系结构研究来说,RISC-V 是一个非常有吸引力的平台。
第五,供应链多样化
RISC-V 允许不同企业、大学和研究机构实现兼容处理器。
这可以降低整个产业只依赖少数指令集授权方的风险。
但是这里必须强调:
开放指令集,不等于自动获得高性能处理器。
RISC-V 并不会自动解决:
|
1 2 3 4 5 6 7 8 |
晶圆制造 EDA 工具 先进封装 高速内存 GPU 芯片验证 软件生态 |
RISC-V 开放的是软件与处理器之间的关键接口。
至于处理器性能有多高,仍然取决于设计能力、制造工艺、缓存、流水线和编译器优化。
第二章:RISC-V Linux 还缺少什么?
第一,平台仍然比较碎片化
目前很多 RISC-V 开发板仍然需要使用厂商提供的专用镜像。
一块开发板的系统镜像,通常不能直接安装到另一块开发板上。
因为不同平台使用的启动固件、设备树、网卡、GPU 和外围芯片可能完全不同。
RVA23、UEFI、ACPI 和服务器平台规范正在改善这个问题。
但距离 x86 PC 那种下载一个 ISO,就能安装到大量不同电脑上的兼容性,仍然需要时间。
第二,桌面图形生态还不成熟
有些 RISC-V 开发板已经可以启动 GNOME 或 KDE。
但是能看到桌面,不等于已经拥有成熟的桌面体验。
一台真正好用的桌面电脑还需要:
|
1 2 3 4 5 6 7 8 9 10 11 |
稳定的 GPU 驱动 浏览器图形加速 视频硬件解码 Wi-Fi 蓝牙 音频 摄像头 外接显示器 睡眠和唤醒 电源管理 |
目前 RISC-V Linux 桌面比较薄弱的部分,已经不再是基本命令和普通用户空间。
真正的问题更多出现在图形加速、外围驱动和整机集成。
第三,处理器性能仍有差距
指令集开放,并不代表处理器一定更快。
CPU 性能还取决于:
|
1 2 3 4 5 6 7 8 9 |
流水线深度 乱序执行 分支预测 缓存设计 内存控制器 处理器频率 制造工艺 编译器优化 |
一些高性能 RISC-V 核心已经取得了很大进步。
但是普通消费者目前可以买到的 RISC-V 产品,在单线程性能、GPU、功耗控制和整机体验方面,通常仍然无法全面替代最新的 x86 和 ARM 系统。
第四,闭源软件仍然是障碍
开源软件通常可以重新编译。
但是闭源软件必须由软件厂商主动发布 RISC-V 版本。
一些商业数据库、专业设计软件、云服务 Agent、视频会议软件和浏览器 DRM 模块,可能只有 x86 或 ARM 版本。
即使 Linux 本身已经支持 RISC-V,如果关键应用程序没有 RISC-V 二进制文件,用户仍然无法正常使用。
第五,服务器标准仍在建设
RISC-V 已经能够运行 Linux、容器和虚拟化软件。
但是企业服务器还需要很多额外能力。
例如:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
RAS 可靠性机制 IOMMU PCI Express 标准中断控制器 NUMA 设备热插拔 安全启动 TPM UEFI ACPI 性能监控 虚拟机迁移 |
所以 RISC-V 服务器已经从概念验证阶段,进入了建立工业标准的阶段。
但它距离 x86 服务器几十年积累起来的成熟生态,仍然有明显距离。
第三章:没有开发板,怎样体验 RISC-V?
现在进入今天最重要的实战部分。
我们使用的工具叫作 QEMU。
QEMU 是一个开源的处理器模拟器和虚拟化工具。
它有两种非常容易混淆的运行方式。
第一种叫作用户模式模拟。
第二种叫作完整系统模拟。
什么是用户模式模拟?
用户模式只运行一个特定架构的程序。
例如,我们在 x86 Linux 电脑上,运行一个为 RISC-V 编译的程序。
这时 QEMU 主要模拟 RISC-V CPU 指令。
流程大概是:
|
1 2 3 4 5 6 7 8 9 10 |
RISC-V 程序 ↓ qemu-riscv64 ↓ 翻译 RISC-V 指令 ↓ 调用宿主机 Linux 内核 ↓ 显示运行结果 |
这种模式启动速度快,非常适合测试程序、学习汇编和验证交叉编译器。
QEMU 官方将用户模式定义为:在一种 CPU 架构上,运行为另一种 CPU 架构编译的 Linux 或 BSD 程序。
什么是完整系统模拟?
完整系统模拟的范围更大。
它不仅模拟 CPU,还模拟:
|
1 2 3 4 5 6 7 8 |
内存 中断控制器 串口 磁盘 网卡 PCI 设备 启动固件 |
这时我们模拟的是一台完整的 RISC-V 计算机。
流程大概是:
|
1 2 3 4 5 6 7 8 9 10 |
虚拟 RISC-V CPU ↓ OpenSBI ↓ Linux Kernel ↓ 根文件系统 ↓ 完整 RISC-V Linux |
QEMU 官方文档明确区分了用户模式和完整系统模式;系统模式会提供 CPU、内存和虚拟设备模型,用来启动完整的客户操作系统。
今天我们先完成用户模式实验,然后再安装完整系统模拟器。
第四章:在 Ubuntu 或 Debian 中安装 QEMU
第一步:更新软件包列表
打开终端,输入:
|
1 2 |
sudo apt update |
这个命令不会安装软件。
它只是更新本地的软件包索引。
第二步:安装交叉编译器和用户模式 QEMU
输入下面的命令:
|
1 2 3 4 5 |
sudo apt install -y \ gcc-riscv64-linux-gnu \ qemu-user \ file |
这里一共安装三个工具。
第一个是:
|
1 2 |
gcc-riscv64-linux-gnu |
它是 RISC-V 64 位 Linux 交叉编译器。
我们的电脑可能使用 x86 CPU,但这个编译器生成的是 RISC-V 程序。
第二个是:
|
1 2 |
qemu-user |
它提供:
|
1 2 |
qemu-riscv64 |
这个程序可以运行 RISC-V 64 位 Linux 应用。
第三个是:
|
1 2 |
file |
它可以检查一个文件究竟是 x86 程序、ARM 程序,还是 RISC-V 程序。
Ubuntu 和 Debian 的软件仓库都提供 qemu-user 和 gcc-riscv64-linux-gnu;qemu-user 软件包包含 qemu-riscv64 用户模式模拟器。
第三步:检查是否安装成功
输入:
|
1 2 |
qemu-riscv64 --version |
然后输入:
|
1 2 |
riscv64-linux-gnu-gcc --version |
还可以运行:
|
1 2 |
which qemu-riscv64 |
正常情况下,应该看到类似:
|
1 2 |
/usr/bin/qemu-riscv64 |
如果三个命令都能正常执行,说明用户模式环境已经安装完成。
第五章:编写第一个 RISC-V 程序
首先建立一个实验目录:
|
1 2 3 |
mkdir -p ~/riscv-qemu-demo cd ~/riscv-qemu-demo |
然后建立一个 C 程序:
|
1 2 |
nano hello.c |
输入下面的代码:
|
1 2 3 4 5 6 7 8 |
#include <stdio.h> int main(void) { printf("Hello from RISC-V Linux!\n"); return 0; } |
保存文件。
在 nano 中,可以按:
|
1 2 3 4 |
Ctrl 加 O 回车 Ctrl 加 X |
第六章:把 C 程序编译成 RISC-V 程序
输入:
|
1 2 3 4 5 6 |
riscv64-linux-gnu-gcc \ -O2 \ -static \ hello.c \ -o hello-riscv |
这里需要解释几个参数。
|
1 2 |
-O2 |
表示启用常用的编译优化。
|
1 2 |
-static |
表示静态链接。
也就是把程序需要的 C 库代码,尽量一起放进可执行文件。
为什么第一个实验要使用静态链接?
因为我们的 x86 电脑通常没有完整的 RISC-V 动态链接环境。
如果直接生成动态程序,运行时可能会找不到 RISC-V 的动态加载器。
使用静态链接,可以让第一个实验更加简单。
检查生成的程序
输入:
|
1 2 |
file hello-riscv |
应该看到类似:
|
1 2 3 4 |
ELF 64-bit LSB executable UCB RISC-V statically linked |
这里最重要的是两个信息:
|
1 2 3 |
RISC-V statically linked |
这证明它不是 x86 程序。
它是一个真正的 64 位 RISC-V Linux 程序。
还可以输入:
|
1 2 |
readelf -h hello-riscv |
找到类似下面的内容:
|
1 2 3 |
Class: ELF64 Machine: RISC-V |
第七章:使用 QEMU 运行 RISC-V 程序
现在输入:
|
1 2 |
qemu-riscv64 ./hello-riscv |
屏幕应该显示:
|
1 2 |
Hello from RISC-V Linux! |
到这里,我们已经完成了第一个 RISC-V Linux 实验。
这条路径是:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
hello.c ↓ RISC-V GCC 交叉编译器 ↓ RISC-V ELF 程序 ↓ qemu-riscv64 ↓ 宿主机 Linux 内核 ↓ 终端输出 |
虽然我们的电脑使用的是 x86 或 ARM CPU,但是程序本身使用的确实是 RISC-V 指令。
QEMU 在运行过程中,把这些 RISC-V 指令翻译成宿主机能够执行的代码。
查看 RISC-V 汇编
如果想观察程序中的 RISC-V 指令,可以输入:
|
1 2 3 4 5 |
riscv64-linux-gnu-objdump \ -d \ hello-riscv \ | less |
你可能会看到:
|
1 2 3 4 5 6 |
addi ld sd jal ret |
这些就是程序中的 RISC-V 指令。
按下字母:
|
1 2 |
q |
即可退出 less。
这个实验特别适合教学。
因为它把 C 语言、编译器、ELF 文件、RISC-V 指令和 Linux 运行环境连接到了一起。
第八章:为什么有时会出现动态加载器错误?
如果我们去掉 -static:
|
1 2 3 4 |
riscv64-linux-gnu-gcc \ hello.c \ -o hello-riscv-dynamic |
然后直接运行:
|
1 2 |
qemu-riscv64 ./hello-riscv-dynamic |
有些系统可能会报告:
|
1 2 3 |
Could not open ld-linux-riscv64-lp64d.so.1 |
这并不代表程序编译失败。
问题是 QEMU 找不到 RISC-V 的动态加载器和共享库。
这时可以告诉 QEMU,RISC-V 系统库位于什么位置:
|
1 2 3 4 |
qemu-riscv64 \ -L /usr/riscv64-linux-gnu \ ./hello-riscv-dynamic |
其中:
|
1 2 |
-L /usr/riscv64-linux-gnu |
表示把这个目录当作 RISC-V 程序的库文件根目录。
对于第一个实验,直接使用 -static 最简单。
以后研究动态链接和共享库时,再使用 -L 参数。
第九章:安装完整系统模式
用户模式只能运行单个 RISC-V 程序。
如果要模拟完整的 RISC-V 计算机,需要:
|
1 2 |
qemu-system-riscv64 |
这里要特别注意,不同 Ubuntu 和 Debian 版本的软件包名称可能不同。
Ubuntu 24.04
可以安装:
|
1 2 |
sudo apt install -y qemu-system-misc |
Ubuntu 24.04 将 RISC-V 等多种系统模拟器放在 qemu-system-misc 软件包中。
Debian 13
可以安装:
|
1 2 |
sudo apt install -y qemu-system-riscv |
Ubuntu 26.04
同样可以安装:
|
1 2 |
sudo apt install -y qemu-system-riscv |
Debian 13 和 Ubuntu 26.04 都提供了独立的 qemu-system-riscv 软件包,其中包含 32 位和64位 RISC-V 完整系统模拟器。
安装完成后,输入:
|
1 2 |
qemu-system-riscv64 --version |
还可以查看支持的虚拟主板:
|
1 2 |
qemu-system-riscv64 -machine help |
第十章:启动 RISC-V 虚拟主板
输入:
|
1 2 3 4 5 6 7 |
qemu-system-riscv64 \ -machine virt \ -m 1G \ -smp 2 \ -bios default \ -nographic |
下面逐个解释。
|
1 2 |
qemu-system-riscv64 |
启动 64 位 RISC-V 完整系统模拟器。
|
1 2 |
-machine virt |
选择 QEMU 的通用 RISC-V 虚拟主板。
这块主板不对应某一个真实产品,而是专门用于运行虚拟机。
如果目的只是运行 Linux,而不是精确模拟某块真实开发板,QEMU 官方建议使用 virt 平台。
|
1 2 |
-m 1G |
给虚拟机分配 1 GB 内存。
|
1 2 |
-smp 2 |
模拟两个 RISC-V CPU 核心。
|
1 2 |
-bios default |
加载 QEMU 自带的默认 OpenSBI 固件。
|
1 2 |
-nographic |
不打开图形窗口,把虚拟串口输出直接显示在当前终端。
QEMU 的 RISC-V virt 平台可以自动加载默认 OpenSBI 固件,然后再通过 -kernel 加载 Linux 内核。
运行以后,你可能会看到 OpenSBI 的启动信息。
但系统随后停在那里。
这是正常现象。
因为我们目前只加载了 OpenSBI,还没有提供 Linux 内核。
要退出 QEMU,先按:
|
1 2 |
Ctrl 加 A |
松开以后,再按:
|
1 2 |
X |
在 -nographic 模式下,Ctrl+A、X 是 QEMU 官方定义的退出组合键。
第十一章:完整 RISC-V Linux 怎样启动?
要真正启动完整 Linux,我们至少需要:
|
1 2 3 4 5 |
OpenSBI 固件 Linux 内核 Image 根文件系统 内核启动参数 |
基本命令可以写成:
|
1 2 3 4 5 6 7 8 9 10 |
qemu-system-riscv64 \ -machine virt \ -m 2G \ -smp 4 \ -bios default \ -kernel Image \ -initrd rootfs.cpio.gz \ -append "console=ttyS0 root=/dev/ram rdinit=/sbin/init" \ -nographic |
其中:
|
1 2 |
-kernel Image |
指定 RISC-V Linux 内核。
|
1 2 |
-initrd rootfs.cpio.gz |
指定初始根文件系统。
|
1 2 |
-append |
向 Linux 内核传递启动参数。
|
1 2 |
console=ttyS0 |
让 Linux 把启动信息发送到虚拟串口。
|
1 2 |
root=/dev/ram |
告诉内核使用内存中的 initramfs 作为根文件系统。
|
1 2 |
rdinit=/sbin/init |
指定系统启动后首先运行的程序。
QEMU 官方给出的 RISC-V virt 启动方法,同样使用 -kernel、-initrd 和 -append 参数加载 Linux 内核与根文件系统。
需要注意,这只是通用命令模板。
具体参数还要根据你下载或者制作的内核和根文件系统进行调整。
第十二章:Windows 11 用户怎么办?
如果你的主机运行 Windows 11,最简单的方法不是直接在 Windows 中配置整套交叉编译环境。
更方便的方法,是先安装 WSL。
用管理员身份打开 PowerShell,输入:
|
1 2 |
wsl --install |
然后重新启动电脑。
默认情况下,这条命令会安装 WSL 和 Ubuntu。
进入 Ubuntu 终端以后,就可以执行前面完全相同的 APT 命令:
|
1 2 3 4 5 6 7 |
sudo apt update sudo apt install -y \ gcc-riscv64-linux-gnu \ qemu-user \ file |
微软官方说明,Windows 11 可以通过 wsl --install 安装 WSL 和默认的 Ubuntu Linux 环境。
对于今天的用户模式实验,WSL 中运行 QEMU 通常已经足够。
第十三章:常见问题
问题一:找不到 qemu-riscv64
如果出现:
|
1 2 |
qemu-riscv64: command not found |
检查是否安装了:
|
1 2 |
sudo apt install qemu-user |
注意:
|
1 2 |
qemu-user |
提供的是用户模式。
|
1 2 |
qemu-system-riscv64 |
属于完整系统模式。
它们不是同一个程序。
问题二:出现 Exec format error
如果直接输入:
|
1 2 |
./hello-riscv |
可能会看到:
|
1 2 |
Exec format error |
这是因为当前 Linux 内核发现它不是宿主机架构的程序。
最简单的解决方法是明确使用:
|
1 2 |
qemu-riscv64 ./hello-riscv |
问题三:找不到动态加载器
如果出现:
|
1 2 3 |
Could not open ld-linux-riscv64-lp64d.so.1 |
可以使用静态编译:
|
1 2 3 4 5 |
riscv64-linux-gnu-gcc \ -static \ hello.c \ -o hello-riscv |
或者运行动态程序时加入:
|
1 2 3 4 |
qemu-riscv64 \ -L /usr/riscv64-linux-gnu \ ./hello-riscv-dynamic |
问题四:qemu-system-riscv64 找不到
Ubuntu 24.04 尝试安装:
|
1 2 |
sudo apt install qemu-system-misc |
Debian 13 或 Ubuntu 26.04 尝试安装:
|
1 2 |
sudo apt install qemu-system-riscv |
问题五:启动以后只有 OpenSBI
如果你只运行:
|
1 2 3 4 5 |
qemu-system-riscv64 \ -machine virt \ -bios default \ -nographic |
看到 OpenSBI 后停止,是正常现象。
因为你还没有使用:
|
1 2 |
-kernel |
指定 Linux 内核。
OpenSBI 不是完整操作系统。
它只是 RISC-V 固件层。
问题六:QEMU 为什么比较慢?
当宿主机是 x86,而客户系统是 RISC-V 时,CPU 指令需要通过 QEMU 的动态翻译器进行模拟。
所以这种跨架构模拟通常比原生运行慢。
QEMU 的主要价值不是让 RISC-V 程序达到原生性能。
它的价值是:
|
1 2 3 4 5 6 |
没有开发板也能学习 提前开发软件 测试编译器 调试 Linux 内核 验证启动流程 |
结论
RISC-V Linux 目前还没有全面替代 x86 和 ARM。
它在桌面图形、处理器性能、闭源软件和服务器标准方面,仍然需要继续发展。
但是对于计算机教学、嵌入式系统、边缘 AI、编译器和 Linux 内核研究来说,它已经是一个非常有价值的平台。
更重要的是,你不需要立刻购买 RISC-V 开发板。
只要一台普通 Linux 电脑,或者一台安装了 WSL 的 Windows 11 电脑,就可以使用交叉编译器和 QEMU,完成第一步实验。
今天我们完成的是:
|
1 2 3 4 5 6 7 8 9 10 |
C 语言 ↓ RISC-V 交叉编译 ↓ RISC-V ELF 程序 ↓ QEMU 用户模式 ↓ 程序成功运行 |
然后,我们又安装了完整系统模拟器,了解了:
|
1 2 3 4 5 6 7 8 |
虚拟 RISC-V 主板 ↓ OpenSBI ↓ Linux 内核 ↓ 根文件系统 |
这就是学习 RISC-V Linux 最低成本、也最清晰的一条入门路线。
感谢大家观看,我们下期再见。
