东京大学版一生一芯:自制CPU,成功运行类Unix系统( 四 )


这个漏洞很难在硬件层面上低成本地修复 , 所以为了解决它 , 我们为我们的 Xv6 引入了 Page Coloring 。 这会为每个缓存行引入「颜色」并重新分配页面 , 使得指向同一物理地址的虚拟地址总会有一样的颜色 。 这意味着指向同一物理地址的虚拟地址总是仅有一个缓存 。 这能让 Xv6 确保 GAIA 永远不会让多个缓存共用同一个物理地址 。
三月:Xv6 跑起来!
3 月 1 日 , Xv6 移植工作完成 。 现在 Xv6 已经运行在模拟器上了!
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
娱乐少不了
一开始 , 移植 Xv6 是因为这很有趣 , 现在 Xv6 已经成功运行在模拟器上 , 那我们就要加把劲让它更有趣 。
首先 , Masayoshi 用大约 4 个小时做了一个小火车以及运行在 Xv6 上的 sl 命令 。
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
Shohei 则想做一个扫雷游戏 。
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
在这期间 , Yuichi 完成了 Group X 的 CPU 实现工作 。 真正的 CPU 的运行速度比模拟器快多了 , 这能让我们更轻松地玩耍和开发游戏 。 这时候 , 我们创建了一个非常高质量的应用:2048 。
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
这个 2048 的质量很高 。 Yuichi 老是在玩 。 顺便提一句 , 这个 2048 使用的是 non-line buffering 输入 , 这是 Xv6 原本没有的功能 。 为了支持这一功能 , ioctl 被添加进来作为 read 和 write 之外的另一个 devsw 动作 , 另外还添加了用来控制 ICANON 和 echo 的与 termios 相关的新功能 。 因此 , 唯一能以如此高的完成度玩 2048 的 Xv6 就运行在 GAIA 上 。
另外 , 毕竟 Xv6 是由 Unix v6 启发的 , 因此我猜想 , 添加 gtty 和 stty 系统调用是更像 Unix v6 的方法 。 不过 , 因为 Xv6 没有 tty 的概念 , 所以我采用了 ioctl;而且事实上 Unix v7 就引入了 ioctl , 所以这与历史情况也接近 。
现在 , 更酷的是 , Keiichi 又为 Xv6-GAIA 做了一个小型汇编器 , Shohei 还做了一个 mini vi 。 想想看你能用这两个工具做什么 。
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
这就是基于 FPGA 的交互式编程!这是 CPU 实验的一个出色演示 , 因为其中一般不包括任何交互式程序 。
最棒的演示
CPU 实验实践课程的原始任务是「在自制 CPU 上运行给定的光线追踪程序」 。 现在我们的 CPU 上有操作系统了 , 你知道该怎么做了吗?我们决定在我们的 CPU 的 OS 上运行这个光线追踪程序 。 我们遇到了一些问题 , 但我们在最终展示前一个小时里成功解决了它们 。
东京大学版一生一芯:自制CPU,成功运行类Unix系统
本文插图
因此 , 我们做了我们这个系的学生开玩笑时说的话:在一个 CPU 上运行一个操作系统 , 然后再在上面运行光线追踪程序 。
来自 2020 年的回顾
这段故事发生在 2015 年 , 本文也是我自己的博文的翻新稿 。 尽管现在读来 , 我看到了当时自身技术经验的不足 , 但我们当时做的事情实在很激动人心 。
另外 , 你现在也可以在你的浏览器中体验我们的 Xv6:https://nullpo-head.github.io/emcc-gaia-simu/xv6.html
实验之后 , 我将我们的 GAIA 模拟器通过 Emscripten 移植到了 JavaScript 。 去试试看我们的 sl、扫雷和 2048 吧 。