自作CPU & 自作OSをやっていく (1) - 全体像(随時更新)

2020年1月から、趣味エンジニアリング活動として自作CPUと自作OSをやっていく。

第一回のこの記事では、目指してることとか、作りたい成果物とか、ロードマップとか、進捗とかを記録していく。インプットが増えたり手を動かしていくと色々と軌道修正があるだろうから、この記事は随時更新されていく。ChangeLogをご参考。
進捗報告は 自作CPU & 自作OS タグで追えるようにしておく。

目次

なぜやるか

  • CPUとかOSとかHPCとか好きだから
  • 2020年3月からプロセッサとかHPCとかコンパイラバックエンドで食っていきそうだから、地力向上
  • 専門分野がニッチになっていくほど同じ分野の人たちと互助的につながっておいたほうが良いので、つながるための媒介として

ゴール成果物

RISC-Vの標準ベンチマークアプリケーション を爆速実行できるCPUとOSを作る。
逆にそれ以外の部分は削ぎ落としていく(例: ファイルシステムとかマルチプロセス管理とか)。

  • FPGA上に実装した64ビットRISC-Vプロセッサ
    • 対応するISA: RV64I (基本命令セット), RV64M (乗算・除算), RV64F (単精度浮動小数点演算), RV64D (倍精度浮動小数点演算), RV64A (アトミック命令)
      • これら全てに対応すると、RV64G を名乗れる。
    • 特徴:
      • 多段パイプライン
      • スーパースカラ
      • アウトオブオーダー実行
  • RV64Gで動作するシンプルなOS
    • 対応するABI: lp64d
    • 提供するサービス:
      • ブートローダー(OS立ち上げの前提)
      • ELFローダー (ファイルシステム上のELFではなく、RAMに予め展開されたものを読む)
      • 文字出力 (実行結果を把握するため)
    • 現代的なOSには備わってるけど今回削ぎ落とすサービス:
      • マルチプロセス管理
      • マルチスレッド管理
        • マルチコアでのプログラム実行は、いずれのコアも同一のプログラムを実行するものとする。シングルスレッドのアプリケーションは明示的に while (mhartid != 0); などで1つのコア以外無限ループさせる必要あり。
      • メモリ管理
        • ヒープ機能も、仮想メモリも提供しない
      • ファイルシステム
      • マルチユーザ
      • 特権レベル・ユーザレベルの使い分け
        • Mモードだけをサポート
      • ディスクI/O
      • ネットワークI/O

何は自分で作らないか

  • ベンチマークアプリケーション
  • RISC-Vエミュレータ
    • OS開発中やベンチマークアプリケーション調査でエミュレータが必要になるが、QEMUを使う。
  • コンパイラ・リンカ
  • チップ
    • 適当なFPGAとか使う。全然詳しくない。同じFPGAにおける最速を目指す。

実装に使う道具

ロードマップ

未知の事項が多すぎて時間的見積もりは取れてない。大体の進行順序(順次見直し)程度。
技術的なロードマップのみならず、披露する機会のイベントとかも入れ込む。

時期 やること 成果 フェーズ
2020/02 RustでのRV64G組み込み開発(w/ QEMU)の開発環境を整える。雛形リポジトリとして公開。 自作CPU & 自作OSをやっていく (2) - 64ビットRISC-Vの “Hello World” をRustで作った OS開発: シングルスレッド
2020/02 ベンチマークプログラムと https://github.com/riscv/riscv-tests を調査し、この記事のTODOを解消。 自作CPU & 自作OSをやっていく (3) - riscv/riscv-tests の挙動を追う OS開発: シングルスレッド
2020/02 OSにELFローダ機能をつける。アプリケーションのELFも、OSと同様に予めRAM上に展開されているもの。最初のアプリケーションは、Memory-mapped I/O で “Hello, World!” するだけのもの。 OS開発: シングルスレッド
2020/02 アプリケーションが文字出力するのを簡便にできるシステムコールを作る。 **TODO: ** ベンチマークプログラムが文字出力のために使うシステムコール(?)を調査。 OS開発: シングルスレッド
2020/02 OSが、https://github.com/riscv/riscv-tests のシングルスレッドプログラムを一通り動作できるようになる。CPUは段階的に作るため、 (-march, -mabi) = (rv64i, lp64), ..., (rv64imfdv, lp64d) のいずれも試す。 OS開発: シングルスレッド
2020/02/24 第1回 自作CPUもくもく会 参加。 CPU開発: RV32I
2020/02-03 32ビット加算器つくる。シミュレーションもFPGA実機もできるようにしておく。 CPU開発: RV32I
2020/02-03 単一クロック方式で add rd,rs1,rs2 の実行できるようにする。 CPU開発: RV32I
2020/02-03 単一クロック方式で addw rd,rs,rs2 の実行できるようにする。 CPU開発: RV64I
2020/03 多段パイプラインで addw rd,rs,rs2 の実行できるようにする。 CPU開発: RV64I
2020/03 多段パイプラインでRV64Iを実装。ベンチマークを取る。 CPU開発: RV64I
- TBD

ChangeLog

author Sho Nakatani a.k.a. laysakura

東京大学大学院 情報理工学系研究科 電子情報学専攻 修士課程で並列分散処理・ストリーム処理・データベースを研究。
2014年4月に株式会社ディー・エヌ・エーにエンジニアスペシャリストとして入社し、ソーシャルゲームのサーバサイド共通基盤の開発に従事。
2016年8月より、オンライン証券会社株式会社FOLIOに入社。バックエンドシステム開発・プロジェクトマネージメント・Engineering Managementに従事。
2020年3月よりIdein株式会社所属。デバイス・高性能計算関連の研究開発。
2021年9月よりトヨタ自動車株式会社所属。自動車データの収集〜分析基盤の研究開発に従事。
その他個人事業主として、RDBMS開発やIntel SGXを利用するためのライブラリ開発などの活動。