1 分•作者: zeristor•4 天前
返回首页
一周热榜
1 分•作者: mpweiher•4 天前
1 分•作者: princeharry86•4 天前
1 分•作者: dabinat•6 天前
1 分•作者: o8vm•4 天前
1 分•作者: TheWiggles•6 天前
1 分•作者: hansmayer•4 天前
1 分•作者: hasheddan•4 天前
1 分•作者: goloroden•4 天前
1 分•作者: optimalsolver•4 天前
1 分•作者: mukulpathak•4 天前
1 分•作者: Flex247A•4 天前
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 +-------------------------------------+ <-- QUEUE_START
0x7FFFDE | QUEUE_READ_IDX |
0x7FFFDD | QUEUE_WRITE_IDX |
+-------------------------------------+
| |
| |
| VRAM (1,024,000 字节) |
| |
| |
0x705FDD +-------------------------------------+ <-- STACK_START
| 栈 |
| | |
| v |
| |
| ^ |
| | |
| 程序数据 + 堆 |
| |
0x000000 +-------------------------------------+
```
我制作了一个小的链接器脚本,以便 C 程序的入口点位于 _start,并且虚拟地址始终为 0。这使得 ELF 加载器代码保持简单。
输入由 rvcore 写入队列,然后由在其中运行的 DOOM 拦截。
演示链接:<a href="https://www.youtube.com/watch?v=f5uygzEmdLw" rel="nofollow">https://www.youtube.com/watch?v=f5uygzEmdLw</a>
1 分•作者: goloroden•4 天前
1 分•作者: pando85•4 天前
1 分•作者: maxloh•4 天前
1 分•作者: tosh•4 天前
1 分•作者: nill0•4 天前
1 分•作者: mjnestor•6 天前
1 分•作者: shaunistyping•6 天前
1 分•作者: thunderbong•4 天前