English | 简体中文
MC-RVVM 是一个强大的工具链,能够将 RISC-V (RV32IMA) 机器码静态转译为原版 Minecraft 数据包 它不仅仅是一个模拟器,而是一场“黑魔法”,让二进制程序能够间接地在 .mcfunction 文件中高速运行
工作原理
MC-RVVM 通过将 RISC-V 机器码 (ELF/bin) 静态转译为 Minecraft 的 .mcfunction 文件来工作
- 内存模拟:使用
scoreboard(计分板) 和storage来模拟 32 位寄存器和 RAM - 指令调度:生成一个二叉搜索树 (BST),以便根据程序计数器 (PC) 高效地跳转到正确的指令函数
- 块优化:将连续的指令合并为单个函数块,以尽量减少调度开销,显著提升性能
想在 Minecraft 里运行 Linux 内核吗?或者玩玩用 C 语言写的 Doom?MC-RVVM 让这一切在纯原版环境下成为可能——无需任何模组
- ⚡ 静态转译:将 ELF 文件预编译为基于树结构的 Minecraft 函数,极大地减少了运行时开销
- 🚀 块优化:自动识别热点代码并进行指令块优化,显著降低调度深度并提高效率(使用
--optimize) - 📺 GPU 渲染引擎:具备基于
text_display的高速渲染功能,支持 48x40 分辨率输出 - 💤 原子睡眠 (Atomic Sleep):完整支持
sleep系统调用,允许暂停指定时长或暂停后续指令的执行 - 🔧 全架构支持:完美支持标准的 RV32IMA 指令集
- 🐧 运行 Linux:包含了
mini-rv32ima的移植版本,允许你在游戏内启动 Linux 6.x 内核(启动虽慢,但它是真正的 Linux 内核!) - 🚀 快速寻址:具有独特的指令折叠和二叉搜索优化,显著提升执行速度
- 💻 优秀的 I/O:实现了可靠的串口 (UART) 输出到聊天栏,并支持基本的数据交互
- 📦 开箱即用:支持 Minecraft 1.21+(数据包格式 48)
构建本项目需要以下工具:
- Python 3.x:用于运行核心转译器和生成脚本
- RISC-V 工具链:编译 C 代码所需
- Ubuntu/Debian:
sudo apt install gcc-riscv64-unknown-elf
- Ubuntu/Debian:
- 设备树编译器 (dtc):编译
mini-rv32ima及其设备树所需- Ubuntu/Debian:
sudo apt install device-tree-compiler
- Ubuntu/Debian:
- Minecraft Java 版:1.21 或更高版本(推荐 1.21.1)
本项目支持使用 GCC 的 Os 标志来加速代码执行 由于 MC 函数执行的瓶颈通常在于寻址时的二叉搜索跳转,减小代码体积 (Os) 通常比传统速度优化 (O3) 效果更好
目前已全面支持并强烈推荐全局优化 使用 -Os 配合 -ffunction-sections 和 -fdata-sections 可以让转译器更好地处理代码结构并提高寻址效率
Tip
为什么选择 Os? 在 Minecraft 中,程序计数器 (PC) 的跳转是通过深层的函数二叉搜索树实现的 更小的二进制体积意味着更少的“页”和更浅的跳转深度,这会直接转化为更高的每刻指令数 (IPT)
git clone https://github.com/Steve3184/MC-RVVM.git
cd MC-RVVMexamples/ 目录包含用于不同目的的各种示例
可用示例列表
一个能够启动 Linux 的完整 RISC-V 模拟器
- 速度:约 980 指令/秒 (Guest)
- 启动时间:约 3 分钟显示首条 kmsg,完整启动约需 9 小时
- 注意:目前仅可见早期内核输出;
init后的 UART 输出暂不可用
make -C examples/mini-rv32ima各种 3D 渲染演示,包括立方体、迷宫和光线追踪 (RTX)
make -C examples/3d
# 或者使用优化版本
make -C examples/fast3d计算高达 10,000 的素数的压力测试
make -C examples/primervvm_test:基础指令集验证vm_baretest:裸机 VM 测试(推荐用于不启动 Linux 时的快速 VM 功能测试)
make -C examples/rvvm_test
make -C examples/vm_baretest显示渲染引擎测试
- 生成的
rv_datapack文件夹即为你的数据包 - 将其复制到存档的
datapacks/目录:~/.minecraft/saves/<存档名称>/datapacks/ - 进入游戏并运行
/datapack enable xxx - 看到绿色的
[MC-RVVM] Loaded.消息即表示成功
要编译你自己的 C 程序,必须使用特定的 GCC 标志以确保兼容性:
必需的 GCC 标志:
-march=rv32ima -mabi=ilp32 -nostdlib -fno-builtin -fno-stack-protector -fno-jump-tables
必需的链接文件:
你必须从 examples/common 目录复制 linker.ld 和 crt0.s 到你的项目文件夹并进行链接;否则程序将无法正常启动
Makefile 示例:
CC = riscv32-unknown-elf-gcc
OBJCOPY = riscv32-unknown-elf-objcopy
PYTHON = python3
CFLAGS = -march=rv32ima -mabi=ilp32 -nostdlib -fno-builtin -fno-stack-protector -ffunction-sections -fdata-sections -fno-jump-tables -I. -Os
LDSCRIPT = linker.ld
CRT0 = crt0.s
MAIN_PY = src/main.py
DATAPACK_DIR = rv_datapack
TARGET = my_program
all: $(TARGET).bin transpile
$(TARGET).elf: $(TARGET).c $(CRT0)
$(CC) $(CFLAGS) -Wl,-Map=$(TARGET).map -T $(LDSCRIPT) $(CRT0) $(TARGET).c -o $@
$(TARGET).bin: $(TARGET).elf
$(OBJCOPY) -O binary $< $@
transpile: $(TARGET).bin
$(PYTHON) $(MAIN_PY) $< $(DATAPACK_DIR) --map_file $(TARGET).map -O
clean:
rm -f *.elf *.bin *.map转译器参数 (src/main.py):
用法: main.py [-h] [--namespace NAMESPACE] [--map_file MAP_FILE] [--optimize] [--ipt IPT] 输入文件 输出目录input_file:二进制文件 (.bin) 或十六进制转储文件的路径output_dir:数据包的输出目录--namespace:数据包命名空间(默认:rv32)--optimize/-O:启用块优化,显著提升复杂程序的运行速度--ipt:设置每刻指令数(默认:2500,最大:3200)--map_file:指定 GCC 生成的.map文件,让块优化器能够识别函数边界
- 重置/开始:
/function rv32:reset - 转储所有寄存器:
/function rv32:debug/dump_inline - 手动 Tick:
/function rv32:tick(正常情况下会自动运行)
如果你编译了完整的 mini-rv32ima 并想尝试启动 Linux:
- 下载内核镜像 linux-6.8-rc1-rv32nommu-cnl-1.zip 并解压出
Image - 使用工具导入内核:
python3 img2mc.py Image rv_datapack/data/rv32/function/load_extra_data.mcfunction rv32
- 启动虚拟机:
/function rv32:reset - 注意:启动 Linux 需要非常长的时间(取决于你的单核 CPU 性能),请耐心等待
src/:核心转译器文件examples/:rvvm_test:基础指令测试mini-rv32ima:完整的 RISC-V 虚拟机实现vm_baretest:用于虚拟机测试的虚拟内核prime:素数计算压力测试common:包含ld配置和内置库实现
img2mc.py:用于导入大型文件/内核镜像的工具rv_datapack/:最终生成的数据包
