在自定义 RISC-V 模拟器上运行 DOOM
在几乎任何计算设备上运行 DOOM 已成为硬件和软件开发领域一个备受赞誉的基准。从智能手表到验孕棒,这款标志性的游戏证明了开发者的创造力以及现代计算的灵活性能。随着最近一个展示在自定义构建的 RISC-V 模拟器上运行 DOOM 的项目,这一传统得以延续,展示了开源指令集架构的力量和易用性。
该项目不仅实现了流行的梗,还为模拟器开发、系统调用(syscall)实现以及将应用程序移植到新的、极简环境中的挑战提供了宝贵的见解。这是一个从简单的 "hello world" 到完全可玩的游戏的过程,阐明了从头开始构建功能性计算平台所需的各种基础步骤。
构建 RISC-V 模拟器
这项工作的核心是一个名为 rvcore 的 RISC-V 模拟器,旨在实现 RV32IM 指令集。选择该指令集意味着专注于紧凑且功能强大的架构,非常适合嵌入式系统和教育项目。该模拟器提供了一个极简的 syscall 接口,这对于任何程序与底层虚拟硬件进行交互(处理输入/输出和内存管理等操作)都至关重要。
ELF 加载与内存管理
为了执行编译后的程序,模拟器集成了 ELF (Executable and Linkable Format) 加载功能。目前,它支持单个 PT_LOAD 段,在简化初始实现的同时,对于许多应用程序来说仍然足够。项目采用了一种自定义的链接脚本,以确保 C 程序的入口点 _start 始终位于虚拟地址 0,从而进一步简化了 ELF 加载器的设计。
内存组织是任何系统的关键方面,rvcore 模拟器定义了一个特定的内存映射来适配 DOOM:
0x7FFFFF +-------------------------------------+
| |
| QUEUE_SIZE (32 bytes) |
| |
0x7FFFDF +-------------------------------------+ <-- QUEUE_START
0x7FFFDE | QUEUE_READ_IDX |
0x7FFFDD | QUEUE_WRITE_IDX |
+-------------------------------------+
| |
| |
| VRAM (1,024,000 bytes) |
| |
| |
0x705FDD +-------------------------------------+ <-- STACK_START
| Stack |
| |
| v |
| |
| ^ |
| |
| Program data + Heap |
| |
0x000000 +-------------------------------------+
这种布局将很大一部分空间分配给了从 0x705FDD 开始的 VRAM (1,024,000 字节),DOOM 在此处渲染其帧。内存顶部的微小队列区域用于处理输入,并配有专门用于读写操作的索引。
移植 DOOM:循序渐进的方法
运行 DOOM 的旅程始于简单的任务,并逐渐构建起必要的架构。
从 "Hello World" 到 C 程序
最初,模拟器使用基础的 "hello world" 汇编程序进行测试。下一个重大障碍是实现 C 程序的执行。这是通过集成 newlib 实现的,这是一个针对嵌入式系统优化的 C 标准库。newlib 允许开发者逐步实现 syscall stub,从而为底层环境提供必要的函数,直到目标程序能够成功运行。
利用 doomgeneric
为了简化移植过程,该项目利用了 doomgeneric。该项目为 DOOM 提供了一个极简且可移植的层,它抽象掉了平台特定的细节,使得在基础 syscall 和渲染机制就绪后,能够更容易地让游戏运行起来。有了 doomgeneric,主要任务就变成了实现与模拟器虚拟硬件交互所需的 stub 函数。
输入与输出处理
DOOM 将其输出渲染到内存中的一个固定区域,具体是起始于 0x705FDD 的 VRAM 区域。模拟器负责将该内存区域解释为显示输出。输入(例如键盘命令)则通过将其写入内存中指定的队列中来处理。运行在模拟器中的 DOOM 实例随后会拦截并处理这些输入,从而完成交互循环。
DOOM 移植项目的持久遗产
像这样在 RISC-V 模拟器上运行 DOOM 的项目在技术社区中引起了深远的共鸣。它们通常会受到热烈欢迎,,体现了探索精神和技术掌控力。正如 Hacker News 用户 @patrickhener 所言:
There is nothing, that can not run DOOM. I love those type of projects. Thanks for showing.
这种情绪表达了移植 DOOM 的文化意义,对于许多探索新硬件或软件平台的开发者来说,这已演变成一种“入场仪式”。它有力地展示了系统的能力,并证明了游戏本身设计之经久不衰。另一位用户 @ani_k47 简单地表示,“Things like this are really cool,”,概括了人们对这类富有创意且具挑战性的尝试的广泛赞赏。
这个 RISC-V DOOM 模拟器是一个极具说服力的范例,展示了通过开源硬件架构和专注的开发可以实现什么。它不仅为经典游戏提供了一个功能性平台,并为对系统模拟和应用移植的低层细节感兴趣的 anyone 都可以提供了一个教育资源。