「OSを作れる」「仕組みが学べる」という言葉に惹かれて、プログラミング軽くかじった程度の私が、OSを自作しようと思い立ちました。

2019年の目標の一つは『OS自作入門でOSを作る』です。

 

目標を次のように設定。

「2019年3月31日までに、完読してわからないなりにもOSを自作してみよう。」

 

さて、『本書』の内容が分からないながらも「Chapter3」に入りました。

「良く分からないのに、先へどんどこ進めてよいのか?」

とも悩んでいるのですが、考え込むとそのまま何もできなくなりそうなので進みます。メモしていることも理解している範囲で、間違っていたら後から修正していきます。

 

Chapter3から、OSの名前が変わりました。hello-osから「はりぼてOS」になるようです。

 

また、『本書』に記載されているリンク先(AT)BIOSはリンク切れだったので、http://oswiki.osask.jp/?(AT)BIOS

 

◆ ブートセクタ部分をつくる。

ブートセクタ:フロッピーディスクの最初のセクタのこと。フロッピーディスクは1バイトずつの読み書きができず、512バイト(1セクタ)ずつまとめて読み書きしている。PCはまず最初のセクタを読む。それで最後の2バイトを見る。これが 55 AA でなければ、このディスクは起動に必要なプログラムは書かれていないと判断し、エラーがでる。

<プログラムと新出命令>

・harib00a

「JC」:「jump it carry」キャリーフラグが 1だったら、ジャンプしなさい。キャリーフラグとは、1ビットしか記憶できないできないレジスタで、CPUはこのようなレジスタを持っている。
エラーがない場合はキャリーフラグが0, エラーがある場合はキャリーフラグが1。

「バッファアドレス」:メモリをどこに読み込むか、それを表す番地。
ES = 0x0820, BX = 0なので、このディスクのデータが読み込まれるのは、0x8200番地から0x83ffまで。なぜ、0x0820が0x8200になるのか。。。

 

・harib00b

「JNC」:「jump if not carry」キャリーフラグが0だったらジャンプ。

「JAC」:「jump if above or equal」大きいかもしくは等しければジャンプ。

エラーがあった場合は、読み込みなおす前に、AH = 0x00, DL = 0x00, INT 0x13(ドライブのリセット)

 

・harib00c

「JBE」:「jump if below or equal」小さいかもしくは等しければジャンプ。

次のセクタを読むのに必要なことは、CL(セクタ番号)を1増やすこと、ES(読み込み番地の指定)を0x20(=512/16)増やすこと。

 

C0-H0-S2からC0-H0-S18までの512 × 17 = 8,704バイトが、メモリ番地 0x8200~0xa3ffに読み込まれた。

 

・harib00d

ディスクの裏側に回って、C0-H1-S1~C0-H1-S18, C1-H0-S1・・・・C9-H1-S18と読み込ませていく。

「JB」:「junp if below」小さければジャンプ。

「EQU」:C言語でいう#defineみたいなものらしい。定数の宣言。
「CYLS EQU 10」というのは、CYLS = 10

 

ここまででディスクのうちの最初の 10 × 2 × 18 × 512 = 184,320 バイト = 180KBが読み込まれた。

 

<フロッピーディスクについて>

CH, CL, DH, DLはそれぞれ、シリンダ番号、セクタ番号、ヘッド番号、ドライブ番号を代入する。

  • ドライブ番号は、どのドライブのディスクを読み込むかを指定する。
  • ディスクにはシリンダが80個あり、外側からシリンダ0, シリンダ1, ・・・シリンダ79という輪が集まったもの。
  • ヘッドは、磁気ヘッドのこと。表と裏があり、ヘッド0, ヘッド1。
  • フロッピーディスクは18等分されていて、この分けられた1つがセクタ。

1枚のディスクには80シリンダあって、ヘッドが合計2つあって、それぞれ18セクタあって、1セクタは512バイトなので、

80 × 2 × 18 × 512 = 1,474,560バイト = 1,440 KB

 

・harib00e

ディスクイメージとして保存できるようにいじっているようだ。

 

ここまでのプログラムで、イメージファイルを作成し、バイナリエディタで開くと次のことがわかる。

空の状態のディスクファイルに対してファイルを普通に保存すると、

  1. ファイル名は0x002600以降に入るらしい。
  2. ファイルの中身は0x004200以降に入るらしい。

 

これで今後は、OS本体をharibote.sysという名前で作って、ディスクイメージに保存させて、ブートセクタからOS本体を実行させるようにできる。

 

harib00g

ブートセクタからOS本体を実行、動作を確認する。

画面モードを0x13を選択。真っ黒画面がでる。

 

ここまででブートセクタが完成。

以上。

 

スポンサーリンク