個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 3-1)

さっそく・・・

3日目にして毎日投稿に失敗しました・・・というのも、本自体はちゃんと3日目のタイミングで読んでいたけど内容を理解するのが難しかった&調べていた&大学の講義が始まって忙しくなったという感じです。(数日後、これを書いている時に再度読んでみたら結構すんなり理解出来て感動しています。)

というのも、本の内容が本当のIPL(初期プログラムローダー)を作るということで、今までのようにBIOSが読み込んでくれる512バイトの次の512バイトを読み込んでみるという内容だったのですが、そもそもこの512バイトごとの分け方(=1セクタ)がフロッピーディスク依存なのでは・・・?と疑問に思ってしまったわけです。
この本は書かれた年的にどうしても現在のPCとは異なる部分が結構あって、例えば今ではOSは64bitが当たり前になりつつある中16bitや32bitが当たり前であったり、当然のようにフロッピーディスクを使用したり・・・などなど。実際問題今となってはフロッピーディスクを入手することの方が困難で、もし仮にフロッピーディスク依存の実装であるなら現在の規格にあった知識にすべきだと思ったわけです。

で、結論から先に述べると、現在のHDDも(というか自分のSSDは)1セクタが512バイトでした。(下の画像のセクターあたりのバイト数
)一応、4Kセクタという規格も広まっているみたいです。
f:id:rei_624:20190411015646p:plain

そうであるなら話は簡単で、本の通りに勉強すればいいだけです。

と思いきや・・・

いきなりフロッピーディスクの仕様の解説が始まりました。
シリンダだったりヘッドだったりセクタだったり・・・
で、今の一般的なHDDではどうやらフロッピーディスクのシリンダがトラックにあたり、このトラックを複数重ねたものがシリンダになっているようです。(ややこしい・・・)

このままでは遅々として先に進めないので、いったん本の通りにフロッピーディスクを仮定して進めていき、知識が身についてきていつか自分でOSを作る時に改めて仕様とにらめっこしようと決めました。わからないことはそのうちわかればいい。。。

ディスクからメモリへ

INT 0x13という命令文で指定したディスクの位置から指定したメモリの位置へ読み込みと書き込みができる。(ソースコードを見る限り一回にごそっと1セクタ読み込むことができるみたい・・・?)
ディスクの位置はフロッピーディスクの場合はドライブ、ヘッド、シリンダ、セクタの指定で行う。メモリの位置はEXレジスタとBSレジスタで行う。

フロッピーディスクを全部読み込むには

まずはセクタを1ずつ増やしつつ読み込んでいく。1シリンダ当たり18セクタあるから18セクタまで読み込んだらシリンダを1増やす。
これを今度はシリンダが80あるから80シリンダまで読み込む。80シリンダまで読み込んだら裏側でも同じことをする。といった感じで順々に読み込むことができる。

OS本体を書く

ついにブートセクタを卒業です!
ブートセクタとは別にOS本体となるアセンブリを書いていく。(例ではHLT命令のみ)このOS本体とさっきまで書いていたフロッピーディスクを全部読み込むブートセクタを同じイメージファイルとして保存することでブートセクタからこのOSを実行させることができるようになる。

といえば聞こえはいいが、実はそこまで簡単に行く話ではなくて、このOS本体がどこに保存されるのかという情報がとても大事になってくる。なぜなら、ブートセクタを起動した後このOS本体の入ったアドレスに飛んでこなければならないから。というわけでOS本体とブートセクタを組み合わせたイメージファイルをバイナリエディタで覗いてみて、格納された位置を探し当てて初めてOSをブートセクタから起動できるようになる。

Day 3-2

内容が濃くてどんどん記事が長くなっていくので分割してDay 3-1とDay 3-2としたいと思います。
Day 3-2では32ビットモードへの準備といよいよ開発言語にC言語導入の部分を書く予定です。

読むスピードに対して備忘録つけるスピードが遅すぎる。。。