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


前段时间 , 中国科学院大学的「一生一芯」计划引发热议 , 五位本科生带着自己设计的处理器芯片正式毕业 , 被称为「最硬核毕业证」 。 其实 , 东京大学信息科学系也有一个自制 CPU 的实践课程 。 近日 , 微软软件工程师 Takaya Saeki 刊文回顾了五年前他们小组的 CPU 实验项目:不仅通过自学自制了 CPU、C 编译器 , 还成功移植了一个类 Unix 操作系统(Xv6) 。 虽然回顾的是五年前的往事 , 但这篇文章应该也能为芯片和操作系统人才培养工作带来一些启发 。
选自Fueled by Coffee , 作者:Takaya Saeki , 机器之心编译 , 编辑:Panda 。
所有这一切都源自一个学生实验项目:CPU Experiment(CPU 实验) 。 首先说说这个 CPU 实验是什么 。
CPU 实验是东京大学信息科学系一个小有名气的实践课程 , 通常在大三的冬季进行 。 在该实验中 , 学生会被分成小组 , 每组四、五个人 。 每一组都要设计一种自己的 CPU 架构 , 在 FPGA 上实现它 , 为该 CPU 构建一个 OCaml 子集编译器 , 然后在该 CPU 上运行一个给定的光线追踪程序 。 通常来说 , CPU、FPU、CPU 模拟器和编译器都各由一两个人负责 。 我负责第 6 组的 CPU 部分 。
这个实践课程的有名之处在于对自学能力的高度期望 。 导师向学生们下达了任务目标:「把这个用 OCaml 写的光线追踪程序运行在你们用 FPGA 实现的 CPU 上」 , 然后就下课了 。 对于编写 CPU 和编译器的具体步骤 , 他不会多说 。 学生需要自己学习如何将学过的有关 CPU 和编译器的一般知识转化成实际成品 , 这将涉及到实际的电路和代码 。 是的 , 这个实践课程确实很难 , 但也很激动人心且极具教育意义 。
在我们自己的 CPU 上运行操作系统
你可能已经注意到了 , 我还没谈到操作系统 。 我来稍微解释一下 。
通常来说 , 这个实验会这样进行 。 首先 , 做出一个能可靠工作的 CPU , 不管计算速度如何 。 如果做出了 CPU 并成功运行了那个光线追踪程序 , 就能得到这个实践课程的学分 。 之后 , 你的团队就自由了 。 通常来说 , 这些自由时间会被用于 CPU 提速 。 在过去的实验中 , 学生做出过乱序 CPU、VLIEW CPU、多核 CPU 甚至超标量 CPU , 确实很了不起 。
但是 , 有些团队则把更多精力放到了一些有趣任务上 , 比如运行游戏或将 CPU 与扬声器连接来播放音乐 。 我们第 6 组也是一个热爱娱乐的小组 , 而我们决定将目标设定为运行一个操作系统 。
结果 , 其它一些小组也对这个想法产生了兴趣 。 于是 , 一个包含 8 个人的联合小组——Group X 成立了 。 我们的目标是:「在我们自己的 CPU 上运行 OS!」
尽管我负责第 6 组的 CPU 创建工作 , 但这一次我选择当 Group X 的领导者 。 因此 , 本文主要是从 OS 团队角度写作的 , 不过我也会介绍 Group X 的整体成果 。
Xv6
对于要移植的 OS , 我们选择了 Xv6 , 这是一个由 Unix v6 启发的简单操作系统 , 是 MIT 为教育目的构建的 。 不同于 Unix v6 , Xv6 是用 ANSI C 编写的 , 而且运行在 x86 架构上 。 Xv6 是一款教育用 OS , 所以功能有些简陋 , 但作为一款简单的类 Unix 操作系统 , 功能已经足够了 。 有关 Xv6 的更多信息可访问其 github 代码库:https://github.com/mit-pdos/xv6-public
挑战
在移植 Xv6 时 , 光是软件方面就有一大堆难题 , 因为我们在尝试从头开始构建一切 。
1. 用于 Xv6 的 C 编译器和工具链 。
在 CPU 实验中 , 我们通常会创建一个 ML 编译器 。 很自然 , 这样无法编译 Xv6 的 C 代码 。
2. 操作系统需要 CPU 具备哪些功能?
特权保护?虚拟地址?中断?是的 , 我们在课堂上已经获得了对操作系统的整体理解 , 但那时候我们对各个 CPU 功能的具体作用还没有真正的切身体会 。