RISC-V虚拟机 | 用 C 编写的 RISC-V CPU 和系统软件实现
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/LekKit/RVVM

用 C 编写的 RISC-V CPU 和系统软件实现
什么工作
- 通过 RV64 和 RV32 的 RISC-V 合规性/酷刑测试
- OpenSBI、U-Boot、自定义固件正确引导和执行
- 工作 Linux、FreeBSD、OpenBSD 和其他很酷的guest OSes操作系统
- Haiku 操作系统来宾支持 (WIP)
- 跟踪 JIT,多核支持
- 帧缓冲图形、鼠标和键盘、UART 外壳
- NVMe 存储驱动器
- 网络(开发中)
💡告诉我更多…
- 功能齐全的 RV64IMAFDC 指令集
- 多核支持 (SMP),SV32/SV39/SV48/SV57 MMU
- 使用 x86_64、ARM64、RISC-V、i386、ARM 后端跟踪 RVJIT(比 QEMU 更快,耶!)
- Bootrom、内核映像加载
- 设备树自动生成,传递给固件/内核
- 用于 VM 集成的 RVVM 公共 API
- UART 16550a 兼容文本控制台
- PLIC/ACLINT、定时器、断电/重置
- 通用 PCI Express 总线
- NVMe 存储、图像 TRIM 支持、快速 IO
- 通过 X11/WinAPI/Haiku/SDL 的图形帧缓冲区
- I2C HID(键盘/鼠标),OpenCores I2C 控制器
- 通过 Linux TAP / WIP 用户网络的 OpenCores 以太网
- PS2 Altera(键盘/鼠标),已弃用
- ATA 硬盘驱动器 (PIO / IDE PCI),已弃用
🛠构建
目前使用 GNU Make(推荐)或 CMake 构建,并且非常便携。
git clone https://github.com/LekKit/RVVM
cd RVVM
make
cd release.linux.x86_64
./rvvm_x86_64 -h
您可以使用 USE 标志配置构建。要交叉编译,将 CC=target-gcc 传递给 make。如果未能检测到特征,则显式传递 ARCH/OS 变量。
例子:
make lib CC=aarch64-linux-android21-clang USE_FB=0
make lib all CC=x86_64-w64-mingw32-gcc USE_NET=1
make CFLAGS=-m32 ARCH=i386 USE_RV64=0 BUILDDIR=build BINARY=rvvm
make CC=mipseb-linux-gnu-gcc USE_JIT=0
或者,您可以使用 CMake:
git clone https://github.com/LekKit/RVVM
cd RVVM
mkdir build
cmake -S. -Bbuild
cmake --build build --target all
cd build
./rvvm -h
🚀运行
./rvvm fw_jump.bin -k u-boot_s.bin -i drive.img -m 2G -smp 2 -res 1280x720 -jitcache 64M
参数说明:
[fw_jump.bin] Initial M-mode firmware, OpenSBI in this case
-k, -kernel u-boot.bin S-mode kernel payload (Linux Image, U-Boot, etc)
-i, -image drive.img Attach NVMe storage image (Raw format as of now)
-m, -mem 2G Memory amount (may be suffixed by k/M/G), default 256M
-s, -smp 2 Amount of cores, single-core machine by default
-res 1280x720 Changes framebuffer & VM window resolution
-jitcache 64M Raise JIT cache limit (64M recommended for complex guests)
. . .
-rv32 Enable 32-bit RISC-V, 64-bit by default
-cmdline, -append ... Override/append default kernel command line
-nogui, -nojit Disable GUI (Use only UART), Disable JIT (for debugging)
调用“./rvvm -h”查看扩展帮助。
测试环境
| 操作系统 | JIT | 图形用户界面 |
|---|---|---|
| Linux | 支持 | X11,SDL |
| Window | 支持 | Win32、SDL |
| MacOS X | 支持,需要签署 M1 | SDL、XQuartz |
| FreeBSD | 支持 | X11,SDL |
| Haiku OS | 支持 | 俳句,SDL |
| Serenity | 由于 W^X 安全而损坏 | SDL |
| Windows CE | 损坏 | Win32 |
| Emscripten | - | SDL |
⚖️执照
本作品根据GPL 3.0或MPL 2.0获得双重许可。如果您使用此作品,您可以选择其中之一。
如果您希望将此作品用作更大的、不符合 GPL 的项目的组件,只要您遵守 MPL 2.0 许可,您可以以任何形式(静态链接、二进制分发、模块)自由使用。
对于任何形式的软件分发,都应公开对此作品所做的精确更改,以遵守任一许可。
源文件头应该逐渐过渡以反映它们的可重用性。
🎉投稿
| Achievments | Working on | |
|---|---|---|
| LekKit | RVVM API & codebase infrastructure RV64IMAFDC interpreter, IRQ/MMU/Priv RVJIT Compiler, X86/RISC-V backends NVMe, ACLINT, UART, I2C, graphics Rework of PCIe, Ethernet, PS/2 |
Networking, Userspace emulation |
| cerg2010cerg2010 | Important fixes, initial RV64 work PLIC, PCI bus, PS2 HID, ATA, Ethernet OC ARM/ARM64 RVJIT backends |
Testing, Assistance |
| Mr0maks | Initial C/M ext interpreter, VM debugger, CSR work, basic UART ARM32 mul/div JIT intrinsics |
- |
| 0xCatPKG | Userspace network, new argument parser Extended testing & portability fixes |
HD Audio |
| X547 | Haiku GUI, I2C HID, Userland API assistance | Guest Haiku support, |
🔍TODO
- 稳定的TCP缓冲,更好的网卡
- 挂起/恢复到文件,VM迁移
- 稀疏块图像格式,压缩/去重
- 声音(高清音频或其他)
- Linux 用户空间系统调用仿真,ELF 加载器
- 用于 GPU 直通的 VFIO
- 更多 RVJIT 优化,共享缓存
- FPU JIT、Vector/Bitmanip 扩展(等待 GCC V ext 支持)
- 来自真实板的其他外围设备(SiFive GPIO、闪存)
- _也许是_virtio 设备(不喜欢虚构设备的想法)
- 多很多…
- KVM 管理程序?替代 CPU 引擎?
RISC-V 商标名称是 RISC-V International 的注册商标。
标签:工具分享