返回首页

一周热榜

1作者: Flex247A4 天前
Hi HN, 我构建了一个 RISC-V 模拟器,它实现了 RV32IM 指令集和一个最小的系统调用接口来运行 DOOM。几周前,我用一个简单的 hello world 汇编程序得到了我的第一个输出。 从那时起,我一直在不懈地努力让 DOOM 运行起来。 我首先需要弄清楚如何运行 C 程序,并接触到了 newlib,它允许底层环境逐个实现系统调用存根,直到程序运行。 我还添加了 ELF 加载,但目前仅支持单个 `PT_LOAD` 段。 为了移植 DOOM,我使用了 doomgeneric,一旦所需的存根就位,它就非常方便地工作了。 DOOM 渲染到内存中的一个固定区域 (0x705FDD = VRAM_START): ``` 0x7FFFFF +-------------------------------------+ | | | QUEUE_SIZE (32 字节) | | | 0x7FFFDF +-------------------------------------+ &lt;-- QUEUE_START 0x7FFFDE | QUEUE_READ_IDX | 0x7FFFDD | QUEUE_WRITE_IDX | +-------------------------------------+ | | | | | VRAM (1,024,000 字节) | | | | | 0x705FDD +-------------------------------------+ &lt;-- STACK_START | 栈 | | | | | v | | | | ^ | | | | | 程序数据 + 堆 | | | 0x000000 +-------------------------------------+ ``` 我制作了一个小的链接器脚本,以便 C 程序的入口点位于 _start,并且虚拟地址始终为 0。这使得 ELF 加载器代码保持简单。 输入由 rvcore 写入队列,然后由在其中运行的 DOOM 拦截。 演示链接:<a href="https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=f5uygzEmdLw" rel="nofollow">https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=f5uygzEmdLw</a>