返回首页
24小时热榜
嗨,HN,
我构建了一个RISC-V模拟器,支持RV32IM指令集,并实现了一个最小的系统调用接口,以便运行DOOM。几周前,我用一个简单的Hello World汇编程序首次获得了输出。
从那时起,我一直在不懈努力,试图让DOOM运行起来。
我首先需要弄清楚如何运行C程序,发现了newlib,它允许底层环境逐个实现系统调用存根,直到程序可以运行。
我还添加了ELF加载功能,但目前只支持单个`PT_LOAD`段。
为了移植DOOM,我使用了doomgeneric,一旦所需的存根到位,工作起来非常方便。
DOOM渲染到内存中的固定区域(0x705FDD = VRAM_START):
```
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 +-------------------------------------+
```
我制作了一个小的链接脚本,使得C程序的入口点位于_start,虚拟地址始终为0。这使得ELF加载器的代码保持简单。
输入由rvcore写入队列,然后被运行在其中的DOOM拦截。
演示链接: [https://www.youtube.com/watch?v=f5uygzEmdLw](https://www.youtube.com/watch?v=f5uygzEmdLw)