「30日でできる! OS自作入門」を読み終わった（実装した）

# 「30日でできる! OS自作入門」を読んだ感想などを書いていきます

[30日でできる！ OS自作入門](https://www.amazon.co.jp/dp/B00IR1HYI0)

書籍のとおりにすすめたので特に目新しい内容はありません。
書籍と違う点は、開発環境がLinux環境で、gccなどの標準的なツール群のみを使用して開発を進めたことです。
これも、すでに多くの方がやっています。
なので、この記事は特に参考になるようなこともないです。自己満足です。日記です。ポエムです。

リポジトリはここです。
[kamaboko123/30daysOS: HariboteOS develop](https://github.com/kamaboko123/30daysOS)
コミットログを見る限り、4ヶ月ちょっとかかったようです。
書籍に対応するように各バージョンごとにディレクトリを作っています。（各バージョン内のディレクトリ構成は私の好みですが）
Linux + gcc + Gasで実装したいけど、途中で詰まってしまった方などは、具体的な解決方法が見えたり、参考になるかもしれません。

![](https://raw.githubusercontent.com/kamaboko123/30daysOS/develop/ss_harib26d.png)

## きっかけ
この本との出会いは15歳の時でした。
私は高専卒なのですが、高専の図書館で見つけたのが初めてです。
当時はパラパラとめくって難しそうだったので、心の片隅は置きつつも特に読んだりはしませんでした。
学生の間に低レイヤーに興味を持つ機会が何度かありましたが、これも難しそうで手が出せずにいました。
社会人になってからは、趣味でソフトウェア[L2SWを作ったり](https://github.com/kamaboko123/salacia-forwarder)してました。
その過程でパケットをヘキサで読んだりするのがだんだん楽しくなってしまい、これがきっかけで再び低レイヤーに目を向けました。
それでこの本を再び手に取りました。


## 書籍の内容について

- 良かったところ
    - 実際にOSを実装できる
    - OSの重要な要素を一通り学べる
        - ブート
        - 割り込み
        - メモリ管理
        - プリエンプティブなマルチタスク
        - メモリ保護
    - コンピュータが動作する仕組みが学べる
    - 標準的なツールを利用したことにより、書籍以上に知識がついた
        - AT&T構文でのx86アセンブラ
        - バイナリが生成されるまでの過程（コンパイルとリンク）
        - 自分が望むバイナリを生成する方法（主にリンカスクリプトなど）
- 微妙だったところ
    - ところどころ綺麗とは言えないコードが出てきてもやもやする（個人の感想です）
        - まず動くものを作ってからきれいにしていくので、だんだんマシになります
    - 書籍が古いこともあり、現代的なOS(ページング、64bit、UEFIなど)を学べるわけではない


## はりぼてOSを実装するまでに勉強した内容

### 事前知識
プログラミング自体は学生の頃からの趣味で約9年ほどになります。
（ガチ勢でも何でもなく、仕事でもほとんどコード書かないので、お遊びでやってる程度のクソザコです）

全くと行っていいほど、低レイヤーな知識は持ち合わせていませんでした。
この本を読む前に以下の2冊を読みました。
アセンブラに対してかなりの抵抗感があったので、それを克服するために読んだだけです。

#### [自作エミュレータで学ぶx86アーキテクチャ](https://book.mynavi.jp/ec/products/detail/id=41347)
この本ではx86の恐ろしさ？を学びました。
CISCらしい可変長命令、ModR/Mという複雑なオペランド指定方法など。。
エミュレータも[実際にC++で実装しながら](https://github.com/kamaboko123/x86emu)読み進めたのですが、テストコードでアセンブラを少し書きました。
それがアセンブルされて、同じmov命令でもオペランドによって全然違うビット列に変わることにびっくりしました。
x86アセンブラが高級言語に見えた瞬間でした。

#### [CPUの創りかた](https://book.mynavi.jp/ec/products/detail/id=22065)
この本で論理回路を学び直しました。
学生の頃の授業で加算器やフリップフロップの知識はありましたが、具体的にどうやってCPUの回路が作られるのかのイメージを持っていませんでした。
ALU・レジスタ・IOポート・命令デコーダなど、コンピュータの動作原理を学び直すことができました。
また。秋葉原でロジックICを書い集めたりして、実際に4bit CPU TD-4も制作しました。
余談ですがこの本のP169ページの記述は本当に秀逸だと思います。
「レジスタなどの記憶素子からデータをALUに送り、何かしらの演算を経て再度どこかの記憶素子にストアする」というのがCPUの基本的な動作です。
ある意味すべての命令は転送命令であるようにも思えて、このページの内容でCPUの見方が大きく変わりました。

この2冊で3-4ヶ月程度を費やしました。
アセンブラよりもさらに低水準なものに触れて、抵抗感がだいぶ薄れました。
これでやっと「30日でできる!OS自作入門」に取り組むことができました。

#### スタックマシンを実装した
[slstm](https://github.com/kamaboko123/experiment/tree/master/slstm)
今となってはひどいコードに見えますが、スタックフレームと、関数コール時のコンテキストスイッチについて学びました。
スタックポインタとベースポインタの切り替えのみで、関数コールとリターンが実装できることに感動しました。

### はりぼてOS開発中に勉強したこと
#### x86アーキテクチャ
[はじめて読む486](https://www.amazon.co.jp/dp/B00OCF5YUA/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
i486の良い本があったので副読本にしました。
30日OS本は良書ですが、CPUの機能については細かく触れません。
そのため、CPU自体の動作の理解のために上記の本を参考にしました。
図解が多くて非常にわかりやすくて楽しいので、改めてちゃんと読み返したいです。

#### ABI
ABIというとかなり意味が広いですが、主に呼び出し規約周りです。
x86で使われているcdeclに始まり、amd64の呼び出し規約も少し勉強しました。
（WindowsとLinuxで引数私に使うレジスタが違ったりすることなど）

## 完走した感想
とにかく毎日いろいろなことを学べました。
「何もわからん」→「完全に理解した」→「何もわからん」を毎日繰り返してました。

OSが実装していると思っていた機能が、実はCPUの機能だったり（メモリ保護や、TSSなど）して、CPUに興味を持ってしまったりしました。。
低レイヤーの沼は深い。

Linux環境で進めるにあたっては、3日目が一番難しかったように思います。
まだアセンブラに慣れていないだけでなく、「リンカスクリプトって何？」って状態でOSイメージを作らなければなりません。
（しかもasmheadなどの解説もだいぶ先で、まだ中身を全然理解できていない頃です。）
いろいろ調べながら、何とか乗り越えました。
これを超えたあとは、意外とすんなり進めることができました。

28日目付近で気づいで少し驚いたのは、はりぼてOSのコンソールが、実質タスクそのものであるということです。
はりぼてOSのコンソールの自体は、OSの一部で、コンソールとしては機能が多いと思っていました。（アプリのリソース管理までやってたりする）
しかし、気づいてみればコンソールのそれ自体が「タスク」で、ファイルハンドラの管理などもやっていました。
(ファイルハンドラをコンソールに持たせたときに、Linuxでいうtask_structのfiles_structが頭をよぎりました)
コンソールを実装した当初は、「コンソールがあるとOSっぽい」みたいな切り口で、ガワからの実装を始めて、開発が終わる頃にはOSの重要なコンポーネントになっていることに驚きました。

OSに限らず低レイヤー楽しいですよね。。
少しハックなことができたりすると特に。
下を知ることで、「上から攻められないなら、下から攻める」ができるのがとても楽しいです。
OSやライブラリやフレームワークなどに隠されている世界が、水面下でどう動いてるのかを知るのはとても楽しいです。
半端ない知識量を求められますが、その分理解したときに出る脳汁の量も半端じゃないきがします。（もはや麻薬だと思います）

## 今後
### 自作OSを作ることにしました
[uroboros](https://github.com/kamaboko123/uroboros)
まだ妄想段階ですが、多少は現代的なOSにしたいと思っています。
UEFIブート、ページング、amd64対応、sysenter/sysexitなどを盛り込みたいと思っています。（たぶん挫折します）
また、目標として、開発中の[ソフトウェアL2SW](https://github.com/kamaboko123/salacia-forwarder)の移植を考えています。（そのためにはNICのドライバ実装も必要ですが。。）

### [はじめてのOSコードリーディング](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEOS%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-UNIX-V6%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-Software-Design/dp/4774154644) を読み始めます
OSを学ぼうとして最初に手をつけた本です。
全く意味分からず数ページで挫折しました。
改めて読み始めようと思います。

### コンパイラとリンカに興味が...
低レイヤーの旅はまだ始まったばかり、まだまだ長い旅になりそうですね。。。