OS自作本 MacOS 1-3日目

めちゃめちゃ重要なこと

HexからBinary変換

  • Hexの各桁がBinaryの4桁になる
  • 0xffff -> 1111 1111 1111 1111
  • 2の16乗 - 1 ≒ 2の16乗 = 64 * 1024 = 64KB

BinaryからHex変換

  • Binaryの4桁分をHexの1桁にする(逆の作業)

この計算を一瞬でできるように!

全体像

細かいところの説明が多く、OS開発の全体像が見えず嫌になっているので、先人たちのまとめをみながらじっくり整理して理解していく。

『30日でできる!OS自作入門』のメモ

このサイトに書かれていることがとてもわかりやすい。

はりぼてOS起動までの流れ

  1. 電源ON
  2. BIOS起動
  3. BIOSフロッピーディスク(以下FD)の先頭1セクタ(IPL)をメモリ(0x7C00~0x7dff)に読み込む
  4. IPLがFDから10シリンダ分をメモリ(0x8200~0x34fff)へ読み込む
  5. OS本体の起動準備(画面モード設定・1MB以上のメモリにアクセスできるようにする・32ビットモードに移行など)
  6. bootpackを用意してあるセグメントにコピーして実行
  7. はりぼてOSの処理

https://wa3.i-3-i.info/word15562.html http://www.cqpub.co.jp/interface/sample/200511/if0511_chap1.pdf

OS 30日本に書かれていることは、これらのWebsiteに書かれていること(PCの電源を入れてからOSが起動するまでの流れ)と合致している。

その他

以下は『30日でできる!OS自作入門』のメモから勝手に使用させていただいています。

ソースコードの役割

対応するソースコード
番号 対応するソースコード
4 ipl10.nas
5,6 asmhead.nas
7 上記以外のbootpack.cやsheet.cなど

asmhead.nasについて

asmhead.nasの処理については最初から理解する必要はないです。 本の中で徐々に解説されていきます。 asmhead.nasですでにメモリにロードされているFDの内容をまた別のところにコピーしているのは、 用意してあるセグメントに移すためと、P171のメモリマップに合わせるためという意図があるようです。

とりあえず、上記の

  • OS本体の起動準備(画面モード設定・1MB以上のメモリにアクセスできるようにする・32ビットモードに移行など)
  • bootpackを用意してあるセグメントにコピーして実行

がasmhead.nasの役割。bootpack.cにいろいろ書くことで、C言語を用いて開発できるようになっているのは、asmhead.nasにbootpack.cとのつなぎの部分が書かれているから。

フロッピーディスク

メモリマップ

ipl10.nas 終了時
アドレス 内容
0x07C00ー0x07DFF IPL。フロッピーの先頭1セクタ(ブートセクタ)
0x08200ー0x34FFF フロッピーの内容(10シリンダ分。IPLを除く)
OS実行時
アドレス 内容
0x00000000ー0x000FFFFF 起動中にいろいろ使うけど、その後は空き(1MB)
(0x000A0000ー0x000AFFFF) VRAM(画面用メモリ) 64KB
0x00100000ー0x00267FFF FDの内容記憶用(1440KB)
0x00268000ー0x0026F7FF 空き(30KB)
0x0026F800ー0x0026FFFF IDT(2KB)
0x00270000ー0x0027FFFF GDT(64KB)
0x00280000ー0x002FFFFF bootpack.hrb(512KB)
0x00300000ー0x003FFFFF スタックなど(1MB)
0x00400000ー 空き

ちなみにp.63に書いてあるが、BIOSのページ (AT)BIOS - os-wiki

によれば

おまけ:一番簡単な画面モード0x13の使い方

このモードは解像度が荒いですが、パックドピクセルなのでとても簡単に扱えます。まず画面モードを切り替えて、そんでもってパレットを設定してしまいましょう。 VRAMは0xa0000~0xaffffの64KBです。厳密に言うと、320x200=64000なので、62.5KBですが。1ドット==1バイトですので、がしがしライトしてください。リードもOKです。たるいBIOSで1点ずつ描いていく必要はありません。以上!

と書いているので

上の

OS実行時
アドレス 内容
0x00000000ー0x000FFFFF 起動中にいろいろ使うけど、その後は空き(1MB)
(0x000A0000ー0x000AFFFF) VRAM(画面用メモリ) 64KB

となる

これからの開発の流れ

  • アセンブラでグローバル関数を書いてライブラリを自分で構築(naskfunc.nas)
  • それを利用しながらbootpack.cのHariMainに実装していく

疑問

  • p.40 「BIOSはPC基板上のRead Only Memoryにあらかじめ組み込まれている、基本的な入出力に関する関数の集まり」とあるが、PC基板上とはどこなのか。ハードウェアでどうやってそんな設計が可能なのか。

  • p.42 「0x00007c00-0x00007dffがブートセクタが読み込まれるアドレス」と書かれているが、これは全てのOSで共通していることなのか?qemuでOSを立ち上げているが、qemuにもこのようなメモリマップの設定がされてあるのか?またブートセクタでやらないといけないことは何なのか。

  • p.44 「Makefileを動かすようにするには、make.exeを呼び出す必要があります。」と書かれているが、macで実行する場合、make.exeは呼び出せない。macの場合のMakefileはどのように起動されているのか?またmake.batには以下のように書かれているが、%1 %2 %3 %4 %5 %6 %7 %8 %9パートは何の役割を果たしているのか?

..¥z_tools¥make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
  • p.52 バッファアドレスを決めるときに、「MOV AL [ES:BX]と書き、ES*16+BXのアドレスを指定することで、114095バイトまでメモリ番地を指定できるようになる」と書いてあるが、結局使うのが16マシンだったらES:BXの計算結果を使えないのではないのか?(結果を使うためにはどこかのレジスタかなんかに保存する必要がありそうなので)