こんにちは、ILab-01です。
プログラマーの中には夢としてCPUやOSを自作するということを考えた人もいるのではないでしょうか?
令和になった現在、CPUやOSの作成に関する本が充実しているため、今となっては勉強がしやすくなっています。
しかし、私がプログラミングを始めた中学生のころは、そんな本はなく、解説書が出回るのは高校生以降の話でした。
しかも、解説書があったとしても知識不足で全く読書が進みませんでした。
結果、CPUとOSを作るまでに10年もかかってしまいました。
そこで、過去の自分がこの順番で勉強していたら効率がよかったのかなぁという順番を紹介していきます。
まずはC言語から
OSの多くはC言語で書かれています。まずは、C言語を学ぶことが大切です。
C言語を一通り学んでいれば、他のプログラミング言語も難なく身につけることができます。
そこで、この2冊を使って勉強します。
大切なことは、C実践プログラミングを読む前に、比較的やさしい本を使ってある程度C言語を学んでおくことです。
詳細はこちらの記事をご覧ください。
アセンブリ
OSの土台となるプログラムはアセンブリを使って書きます。
また、アセンブリを学ぶ別の意義として、C言語のポインタを自然と理解できるようになるという意義があります。
本としては以下のものを使いました (私が使っていたのは実際には前の版)
アルゴリズムとデータ構造
OSでデータを管理する際には、スタックを使います。
また、ポインタを使ったデータ管理に慣れておくと、Linuxやその他OSのソースコードを読むときに役に立つので、アルゴリズムとデータ構造を学んでおくのがおすすめです。
OSの考え方を座学で知る
OSから離れた勉強ばかりをしていると退屈になってきます。
また、OSの概念を知る勉強はいずれ必要になります。
そこで、OSの概念を座学的に学びます。
Linuxコマンド
OSを作る上で、Linuxコマンドは手足のように使えた方が実装効率が上がります。
ただ、目的がないとLinuxコマンドを学ぶ機会は得られません。
そこで、Linux From Scratchという、既存のプログラムを組み合わせてLinux OSを作る無料教材を使います。
Welcome to Linux From Scratch!
大切なことは、Linux From Scratchに出てくるLinuxコマンドをコマンドライン引数の意味も含めて全部理解することです。
この作業はめんどくさくて大変ですが、後々の作業や仕事面で大いに役立ちます。
ついでにOSの自作っぽいことができます。
簡単なCPUの自作
OSを作る上で、CPUの仕組みの理解は必須です。
こちらの本で簡単なCPUの仕組みを学びます。
コンパイラの作成
CPUの仕様 (命令セット) から独自に作る場合、そのCPU専用のコンパイラを作成できる必要があります。
最近はLLVMのような便利なコンパイラ作成ツールがありますが、基礎を学ぶためにあえてこちらを使います。
他の人のOSを再現して作り方を学ぶ
いきなり独自のOSを設計するのは難しいです。
そこで、何種類かのOS自作本を使って、他の人がどうやってOSを作ったのかを学びます。
「はじめてのOSコードリーディング」については、内容は良いのですが、解説の順番が自分にとっては分かりにくかったので、電子ブックのスクリーンショットをとってページの順番を入れ替えて読みました。
「30日でできる! OS自作入門」については、更新版相当の本である「ゼロからのOS自作入門」という本が発売されていますので、こちらを読んでもよいかもしれません。
他の人のCPUの作り方を学ぶ
OSのときと同様に、CPUもいきなり自分で設計するのは難しいです。
前述のCPUの本では基礎的なことは学べますが、より実用的なCPUの仕組みを学ぶにはもっと専門的な情報が必要です。そこで、こちらを読みます。
ハードウェアを学ぶ
CPUだけ存在しても、人間とのやり取りができないため、実用的なコンピュータにはなりません。
したがって、CPU以外のハードウェアの知識も必要です。
世の中には、プログラムを書くような雰囲気でボード上の回路を自由に書き替えられる、FPGAという便利なボードがあります。
そのボードを一般的なPCでいうマザーボードに見立てて使います。
安価に手に入るボードはこちらです。
販売店によっては学割で買えるらしいので、学生さんでも買えそうです。
お金がある人は、DE2-115ボードを使ってもよいでしょう。
DE2-115ボードも、販売店によっては学割が使えます。
Terasic Inc. DE2-115 EVAL BOARD
http://solitonwave.shop/?pid=135616119
そして、本はこちらの3冊を使います。
これらの本は、自作のマシンに搭載したい機能に関わるところだけを学ぶという使い方でも十分です。
読む順番としては、上記の上から順に読んでいくのがおすすめです。
私の場合、上の2冊はがっつりと読み、最後の1冊は必要なところだけつまみ食いしました。
自分のCPUとOSを設計する
CPUとOSの設計をします。ここから先は個人の価値観によってやることが大きく変わってきます。
私の場合は、次のルールでとても簡単なCPUとOSを実装しました。
- コンパイラの作成までやってしまうと時間がかかるため、CPUの命令セットはRISC-Vから借りてくる
- CPUの命令セット以外の部分 (マイクロアーキテクチャ) は自作する
- OSはマルチスレッド機能とシリアル通信機能を持つ簡易的なものとする (時間の都合により)。
- ハードウェアはFPGAとするが、うまくCPUを搭載できない状況が生じた場合はRISC-Vエミュレータ機能を持つQEMUを使用し、OSの開発を断念しないようにする
新たに使った本や情報としては次のものがあります。
「RISC-V原典」は日本語でRISC-Vの仕様が解説された本です。RISC-Vの詳しい仕様が日本語で載っているのはこの本ぐらいじゃないでしょうか。
また、こちらのソースコードも読みます。
xv6-rv32のソースコード
xv6というのは、Unixのソースコードを現代版 (インテルCPU向け) にアレンジしたもので、さらにRISC-V 32bitに対応させたものをxv6-rv32と呼びます。このソースコードを参考に、OSの設計を行いました。
私の結末
RISC-Vのマシンモードの機能を持つ、RISC-V風CPUが自作できました。
公式のテストプログラムもパスできました。
ただし、回路シミュレーション上では…
というのも、調子に乗ってパイプライン処理を載せた、かつ、回路を可読性 (というよりも単純さ?) 重視で最適化しなかったという理由でゲート数が足りなくなり、FPGAには搭載できませんでした。
仕方なく、OS作成はQEMUのRISC-Vエミュレータ向けに行いました。
OSは想定したものが作成できました。
シリアル通信を行うと、マルチスレッドで文字が並列して出力されるだけ、という単純なOSです。
とはいえ、短時間でアプリケーションが動かせるOSを目指すという意味では及第点だったのではないでしょうか。
皆様もお試しあれ。
コメント