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開発の全体像が見えず嫌になっているので、先人たちのまとめをみながらじっくり整理して理解していく。
このサイトに書かれていることがとてもわかりやすい。
はりぼて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とのつなぎの部分が書かれているから。
フロッピーディスク
メモリマップ
アドレス | 内容 |
---|---|
0x07C00ー0x07DFF | IPL。フロッピーの先頭1セクタ(ブートセクタ) |
0x08200ー0x34FFF | フロッピーの内容(10シリンダ分。IPLを除く) |
アドレス | 内容 |
---|---|
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点ずつ描いていく必要はありません。以上!
と書いているので
上の
アドレス | 内容 |
---|---|
0x00000000ー0x000FFFFF | 起動中にいろいろ使うけど、その後は空き(1MB) |
(0x000A0000ー0x000AFFFF) | VRAM(画面用メモリ) 64KB |
となる
これからの開発の流れ
疑問
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の計算結果を使えないのではないのか?(結果を使うためにはどこかのレジスタかなんかに保存する必要がありそうなので)