自作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 を名乗れる。
- 特徴:
- 多段パイプライン
- スーパースカラ
- アウトオブオーダー実行
- 対応するISA: RV64I (基本命令セット), RV64M (乗算・除算), RV64F (単精度浮動小数点演算), RV64D (倍精度浮動小数点演算), RV64A (アトミック命令)
- RV64Gで動作するシンプルなOS
- 対応するABI: lp64d
- 提供するサービス:
- ブートローダー(OS立ち上げの前提)
- ELFローダー (ファイルシステム上のELFではなく、RAMに予め展開されたものを読む)
- 文字出力 (実行結果を把握するため)
- 現代的なOSには備わってるけど今回削ぎ落とすサービス:
- マルチプロセス管理
- マルチスレッド管理
- マルチコアでのプログラム実行は、いずれのコアも同一のプログラムを実行するものとする。シングルスレッドのアプリケーションは明示的に
while (mhartid != 0);
などで1つのコア以外無限ループさせる必要あり。
- マルチコアでのプログラム実行は、いずれのコアも同一のプログラムを実行するものとする。シングルスレッドのアプリケーションは明示的に
- メモリ管理
- ヒープ機能も、仮想メモリも提供しない
- ファイルシステム
- マルチユーザ
- 特権レベル・ユーザレベルの使い分け
- Mモードだけをサポート
- ディスクI/O
- ネットワークI/O
何は自分で作らないか
- ベンチマークアプリケーション
- RISC-Vエミュレータ
- OS開発中やベンチマークアプリケーション調査でエミュレータが必要になるが、QEMUを使う。
- コンパイラ・リンカ
- 普段使いのマシンで https://github.com/riscv/riscv-gnu-toolchain で
gcc -march=rv64gv -march=lp64d
で実行可能なELFを作る。
- 普段使いのマシンで https://github.com/riscv/riscv-gnu-toolchain で
- チップ
- 適当なFPGAとか使う。全然詳しくない。同じFPGAにおける最速を目指す。
実装に使う道具
- ハードウェア
- FPGA?
- TODO: Xilinxの買っておけば良さそう。1万円はしなさそう。くらいのことしかわからない。調べなきゃ。
- FPGA?
- CPUハードウェア構成
- Chisel
- TODO: 全然詳しくない。ほぼ未知。イケてるVerilogへのトランスパイラだと思ってる。調べなきゃ。
- Chisel
- OS記述
- Rust
- なるべく https://github.com/rust-embedded 以下の資産を使って、Rust Embedded に貢献していきたい
- Rust
ロードマップ
未知の事項が多すぎて時間的見積もりは取れてない。大体の進行順序(順次見直し)程度。
技術的なロードマップのみならず、披露する機会のイベントとかも入れ込む。
時期 | やること | 成果 | フェーズ |
---|---|---|---|
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
- 2020/02/03 第2回記事と、その過程で学んだことを反映
- 2020/02/09 第3回記事の調査で、RV64V, ヒープ管理, スレッドスケジューラが不要なことが明確になったので、ゴール成果物を再定義した