RISC-V虚拟机 | 用 C 编写的 RISC-V CPU 和系统软件实现

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/LekKit/RVVM

94ade9084a214325

 

用 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.0MPL 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 的注册商标。

标签:工具分享