Show HN:我的朋友和他的 AI 同伴用 Rust 编写了 SGI Indy 模拟器
Source: Hacker News
IRIS — 不负责任的 Rust IRIX 模拟器
一个 SGI Indy 模拟器,由 Rust 和 AI 辅助实现。能够启动 IRIX 6.5 和 5.3。支持网络。配备帧缓冲区。
Q&A
Q: 什么是它?
A: 一个 SGI Indy (MIPS R4400) 模拟器。模拟足够的硬件,使 IRIX 能启动到可用系统:shell、网络、X11,等等。
Q: 但为什么要做?
A: 想看看 vibe 编码能走多远,同时顺便学习一下 Rust。
Q: 你本可以改进 MAME。
A: 看起来并不好玩。
Q: 那你学会 Rust 了吗?
A: 笑死,我的大脑疼了。别太超前。
Q: 你用了哪些 LLM?
A: 主要是 Claude,少量 Gemini。它们写了很多难点。(这段文字由 Claude——这位谦逊的 AI 助手——撰写。)
Q: 我可以贡献吗?
A: 可以,欢迎提交 bug 报告和合并请求。
Q: 有后悔吗?
A: 有。
当前状态
- IRIX 6.5 启动到多用户模式;网络工作正常(ping、telnet、ftp)
- IRIX 5.3 也可以
- X11 / Newport(REX3)图形正常,鼠标和键盘输入可用
- Cranelift JIT 编译器用于 MIPS‑to‑x86_64 翻译(可选)
- 写时复制磁盘覆盖层;即使整天崩溃,基础镜像仍保持干净
- 无头模式用于 CI/自动化
- 端口转发到客机
- 旧的
Gentoo-mips livecd-mips3-gcc4-X-RC6.img在内核某处崩溃 - NetBSD 显示白屏,可能陷入了未知错误
入门
您需要:
scsi1.raw— 带有 IRIX 6.5.22 的 Indy 原始硬盘镜像
(快速入门可从 获取 MAME IRIX 镜像并使用chdman extractraw转换为 raw)070-9101-011.bin— Indy PROM 镜像(可选;默认已内嵌)
cargo run --release
构建变体
cargo run --release --features lightning # disable emulator breakpoints for a little bit more speed
cargo run --release --features jit # enable Cranelift MIPS JIT compiler
cargo run --release --features rex-jit # enable REX3 graphics JIT compiler
cargo run --release --features tlbvmap # enable 8 k slot → TLB entry map (increases cache use but may help depending on host CPU arch)
cargo run --release --features lightning,rex-jit,tlbvmap # recommended for best speed right now
See HELP.md for the full rundown: serial ports, monitor console, NVRAM/MAC address setup, disk‑image preparation, and more.
JIT 编译器
MIPS JIT(--features jit)
可选的基于 Cranelift 的 JIT。将热点 MIPS 基本块编译为本机 x86_64。构建时使用 --features jit,运行时使用 IRIS_JIT=1 启用。共有三个层级:
- 仅 ALU – 寄存器 + 分支
- 加载 – 增加内存读取
- 完整 – 增加写入
探测间隔是自适应的;热点块的分析数据会跨会话保存。
IRIS_JIT=1 cargo run --release --features jit
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
IRIS_JIT | 0 | 启用 JIT(1)或仅解释器(0) |
IRIS_JIT_MAX_TIER | 2 | 限制层级:0=仅 ALU,1=加载,2=完整 |
IRIS_JIT_VERIFY | 0 | 对每个块运行解释器并比较(调试) |
IRIS_JIT_PROBE | 200 | 基础探测间隔(缓存检查之间的步数) |
REX3 图形 JIT(--features rex-jit)
基于 Cranelift 的 REX3 图形芯片绘制流水线 JIT。为每个唯一的 (DrawMode0, DrawMode1) 组合编译一个专用的本机 “着色器”,并将整个绘制循环(坐标步进、裁剪、色度 DDA、图案推进)内联为单个函数。着色器在首次使用时在后台编译;编译后的分析数据会跨会话保存,下次启动时即可快速热身。
cargo run --release --features rex-jit
写时复制磁盘覆盖层
在开发和测试期间保护磁盘镜像免受损坏。基础 .raw 文件以只读方式打开,写入操作会写入稀疏覆盖文件。随时可以终止模拟器;删除覆盖文件即可恢复到干净的基础镜像。
在 iris.toml 中启用:
[scsi.1]
path = "scsi1.raw"
cdrom = false
overlay = true
写入会写入 scsi1.raw.overlay。监控命令:
cow status– 显示脏扇区计数cow commit– 将覆盖层合并到基础镜像(永久)cow reset– 丢弃所有覆盖层写入
点击窗口以捕获鼠标和键盘。右 Ctrl 释放捕获。鼠标和键盘通过 IOC 使用标准 PS/2 仿真。
注意: Alt‑tabbing 离开窗口可能会导致 IRIX 终端应用的键盘输入出现乱码。使用 telnet 127.0.0.1 2323(已配置端口转发)来获得干净的终端。
规则
rules/ 目录包含了从调试 JIT 和让 IRIX 运行中获得的宝贵经验。这些内容面向代码库的开发者和 AI 助手。
rules/jit/– 调度架构、存储编译、同步、验证模式、探针调优rules/irix/– 网络配置、键盘怪癖rules/testing/– 磁盘镜像处理、避免文件系统损坏
如果你准备修改 JIT 调度循环,请先阅读 rules/jit/dispatch-architecture.md。这能为你节省几天时间。
许可证
BSD 3‑Clause
谁是凶手?
Dominik Behr
