- 大学時代のプロジェクトで、自ら設計したRISC ISAベースのCPUと自作のCコンパイラを用いてXv6オペレーティングシステムの移植を試みた経験の共有
- プロジェクトはCPU設計、Cコンパイラ(Ucc)開発、Xv6移植など、あらゆる要素を自分たちで作る形で進行
- チームはOS動作のために、割り込み、仮想メモリ、キャッシュなど中核となるハードウェア・ソフトウェア機能の設計に挑戦
- Xv6移植の過程で、移植性の問題、デバッグの難しさ、キャッシュバグなど多様な難関に直面したが、自力で解決
- SL、Minesweeper、2048などのインタラクティブアプリケーションやray-tracingプログラムの動作にも成功し、教育的・技術的に大きな達成を得た
プロジェクト概要
- 本プロジェクトは東京大学情報科学科の代表的な実験課題で、学生が中央処理装置(CPU)とハードウェア設計、コンパイラ作成、アプリケーション実行の経験を積むことに重点を置いている
- プロジェクトの目標は、自ら設計したCPUのISAをFPGA上に直接実装し、そのためのCツールチェイン(Ucc)を作成し、さらにXv6のようなオペレーティングシステム移植へと拡張すること
- 実験過程の大部分は自己主導学習で進められた
CPU実験と課題
- 4〜5人のチームがそれぞれ新しいCPUアーキテクチャの設計とFPGA実装、さらにそのアーキテクチャ向けコンパイラ開発に参加
- OCamlサブセットコンパイラ作成後、レイトレーシングプログラムの実行までが必須評価項目
- 追加で時間に余裕があれば独自の挑戦課題を設定でき、一部の学生はCPU高速化、マルチコア開発、音楽・ゲーム実行などの拡張実験を行った
- Group 6チームは特にオペレーティングシステム移植を目標とし、ここから新たな共同チーム(Group X)が結成された
Xv6 OSと移植への挑戦
- 移植対象として**MITで教育用に開発されたXv6(Unix v6ベース、x86向け)**を選択
- Xv6は簡素なUnix系OSだが、実ハードウェアで動かすにはC89コンパイラ、特殊な割り込み、仮想アドレス対応、移植性の低さなど多様な問題が存在
- Xv6はC言語仕様として
charは1バイト、intは4バイトといったx86特性を前提に作られており、移植時に多くの問題が発生した
コンパイラおよびツールチェイン開発(Ucc)
- 既存の実験ではOCamlコンパイラ開発が標準だったが、Xv6動作にはC89コンパイラが必要なため自作を決定
- チームメンバーの一人によるCコンパイラのプロトタイプを基に、新しいツールチェインを独自構築(Ucc)
- コンパイラだけでなくPrimitive Linkerやデバッグツールなども自ら設計
CPUおよびシミュレータ設計
- ハードウェア記述言語(HDL、例: Verilog / VHDL)でCPU回路を設計し、Vivado/Quartusなどの論理合成工程を経て実機FPGAに実装
- 反復的な論理合成工程には非常に時間がかかり、実際には多くの待ち時間を伴った
- CPUの基本機能に加え、割り込み、MMU、TLBなどOS動作に必要なハードウェア支援も別途設計
- CPUはGAIAという名前で完成
- シミュレータには実際の割り込み、仮想アドレス変換、デバッグツールが追加された
移植過程の問題と解決
- Xv6の移植性の低さにより、CPUやコンパイラの仕様次第で異常動作が発生
- 例:
charとintが32ビットとして定義され、ポインタ演算やスタック構造が壊れる問題など
- コンパイラUccで
charを8ビットに合わせるよう改良
- 割り込み処理は高難度領域であり、自作シミュレータに逆アセンブラ、状態ダンプなどのデバッグツールが追加された
- キャッシュエイリアス問題は、GAIAが仮想アドレスをキャッシュインデックスに使っていたことで発生し、Page Coloring手法の導入で解決
最終結果: OSとアプリの実行
- 3月1日、最終的にXv6をシミュレータと実CPU(ハードウェア)の両方で完全に動作させることに成功
- 自作mini curses、SLコマンド、Minesweeper、2048などインタラクティブアプリの動作に成功
- 特に2048ではnon-canonical入力対応の設計を追加
- Xv6の修正により、POSIXスタイルのioctl、termiosなどに相当する機能まで追加
- 小型assembler、mini viなども実装し、実質的な「リアルタイムプログラミング環境」を実現
- レイトレーシングプログラムもオペレーティングシステム上で動作させ、当初の実験目的を超える成果を達成
プロジェクトの意義と後続事例
- 本実験以後、複数世代の学生が自らCPUとOSを作ってさまざまな実験を継続的に実施
- たとえばRISC-V ISA採用、自作OS、Linux動作などへ拡張
- 実習を通じてハードウェア/ソフトウェアの全スタックを直接体験し、アルゴリズム、ハードウェア・ソフトウェア統合、低レベル構造に対する実践的理解を深めた
- 「車輪の再発明」は非効率だという批判もあるが、実際に作って学ぶ学習効果と面白さは非常に大きい
実際の体験とソースコード
結論
- 「自分で作ることほど学べるものはない」という教訓とともに、ハードウェア・ソフトウェア統合経験の重要性を強調
- 後続の学生たちも引き続き新たな目標に挑戦しており、将来的には自作ISA上でLinuxやVMが動作することへの期待が述べられている
- プロジェクト参加メンバーの名前を最後に物語を締めくくる
4件のコメント
大学でこういう経験ができるのはうらやましいですね。面白そうです..
本当にすごく楽しかっただろうな。
もう少し下までスクロールしてみてください…
8ビットCPUを作る…?
https://eater.net/8bit
Hacker News のコメント
昔、大学時代に3人で3週間取り組んだグループプロジェクトのことを思い出した。いくつかのテーマの中に、とても基本的なOSを自作するというものがあり、教授たちに Raspberry Pi へ MINIX3 をポーティングしてよいか尋ねて許可をもらった(MINIX3 にはすでに BeagleBoard 向けの ARM ポートがあったので、できそうだと思った)。<br>難易度は予想よりはるかに高く、想像もしなかった技術的問題が次々に出てきた。特に Raspberry Pi 3 が supervisor モードではなく hypervisor モードで起動するせいで苦労し、QEMU の Raspberry Pi エミュレーションの正確さもあまりにひどくて、OS 開発にはほとんど役に立たなかった。解決策を探して低レベルのハードウェアデバッグに丸1週間を費やした。 <br>最終的には UART、GPIO、フレームバッファドライバを含む動作するポートを作り上げ、Raspberry Pi 2 と 3 での起動に成功した。発表は実機で行い、シェルスクリプトで RAM ディスクイメージを出力し、GPIO ピンを監視して前後のスライド送りができるようにし、ナイフでピンをショートさせて直接操作した。独創性の面では圧倒的に格好いい発表だったし、その SD カードイメージは今でも持っている気がする
すごい経験だったみたいだね<br>MINIX3 を Raspberry Pi にポーティングしようと言い出した瞬間、教授たちも失敗を予想していたのかもしれない<br>QEMU の Raspberry Pi エミュレーション精度がいまひとつなとき、私はまず QEMU 上で OS を動くようにして、その後はハードウェアで運に任せるという戦略を取っていた。それでもうまくいった<br>実際の Raspberry Pi ではどうやってデバッグしていたのか気になる
GPIO をショートさせるのにナイフを使ったと聞いて、ATX マザーボードを電源スイッチなしで起動するために電源ピン2本をショートさせた経験を思い出した<br>それでも君のセットアップの方がずっと格好いい。よくやった
SFU で 25〜30 年前に似たようなことをやったことがある。OS やコンパイラを載せるところまではやっておらず、チームプロジェクトでもなかった<br>こういう実験に興味があるなら、ガイドと敷居の低いツール群がそろっている Turing Complete を勧めたい。いくつかのゲートから本物のコンピュータまで作っていける。コミュニティやコンポーネントも共有できるし、RiscV コアもある。本当に楽しいので Steam で試してみることを勧める<br>Turing Complete Steam リンク
この記事を見ていると、なぜか似たような学術的(?)プロジェクトを思い出す。少なくともカスタム C コンパイラとカスタム OS があった記憶がある。名前は正確には覚えていない
以前投稿された関連トピックも参考までに 以前の記事リンク
CPU + コンパイラ + OS を自分で作っていくとき、下にある既存のプラットフォームは何もない。自分自身がそのままプラットフォームになる。<br>バグこそがシステムの法則だ。普通は誰かが作った抽象化レイヤー上でデバッグするが、ここではそのルールさえ自分で定義する。OP は自分だけのルールそのものをデバッグしたわけだ
本当に印象的だ。ローレベル領域の作業はたいてい退屈で時間もかかるし、特にデバッガのような必須ツールがないとますます大変だ
kprintfのデバッグをした経験がないなら、まだ本当のローレベルの味は知らないということだMagic-1 と BMOW も以前に似たようなことをやっていた<br>詳しくは homebrewcpu.com を参照<br>自作 CPU サイトの一覧は homebrewcpuring.org を参照
もう FPGA に実装する代わりに、半導体研究室に駆け込んで CPU を直接作ってもらうべき段階だ