返回首页

24小时热榜

1作者: Flex247A大约 4 小时前原帖
嗨,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)