30日OS自作本19日目
19章の内容です。typeコマンドでOSにコピーしたファイルの読み込みと、ファイルとしてコピーした機械語の実行を行いました。
FAT12の復習
1セクタ=512バイト
sector | offset | size(Byte) | content |
---|---|---|---|
1 | 0x0000 | 0x0200 | boot sector |
9 | 0x0200 | 0x1200 | fat area |
9 | 0x1400 | 0x1200 | fat area(sub) |
14 | 0x2600 | 0x1c00 | root directory |
2849 | 0x4200 | 0x164200 | file area |
合計2882セクタ
FAT上でどのように物理ファイルを扱うか
MakeFile内で以下のようにOSに直接ファイルを書き込んでいます。
copy from:haribote.sys to:@: \ copy from:ipl10.nas to:@: \ copy from:make.bat to:@: \
NNNNNNNNNNNNNNNNEEEEEETTRRRRRRRRRRRRRRRRRRRRTTTTDDDDCCCCSSSSSSSS 48415249424F54455359530000000000000000000000549CCA4C0200486E0000 49504C31302020204E41530000000000000000000000927B924C3A00950B0000 4D414B45202020204241540000000000000000000000927B924C40002E000000
本書の流れに剃って バイナリダンプしたファイルをバイナリエディタ上で直接探します。
$ hexdump -C haribote.sys 00000000 b8 00 90 8e c0 bf 00 00 b8 00 4f cd 10 3d 4f 00 |..........O..=O.| 00000010 75 52 26 8b 45 04 3d 00 02 72 49 b9 05 01 b8 01 |uR&.E.=..rI.....| 00000020 4f cd 10 3d 4f 00 75 3c 26 80 7d 19 08 75 35 26 |O..=O.u<&.}..u5&| ・・・(略)
先頭の16バイトの内容b800908ec0bf0000b8004fcd103d4f00
でimgファイル内をググってみます
0x41FF
が開始のようです。
同じようにして各ファイルの内容が配備されているアドレスを表に起こして見ました。
file name | clustno | ofset |
---|---|---|
haribote.sys | 0x0002 | 41FF |
ipl10.nas | 0x003A | B1FF |
make.bat | 0x0040 | BDFF |
本書によるとディスクイメージ内のアドレス = clustno * 512 + 0x003e00
で決まるようです。
例えばharibote.sysの場合、0x0002
* 512 + 0x03e00
= 0x0400
+ 0x03e00
= 0x4200
となるのですが、なんか私の調査結果だとさらに-1されてるように見えるのですが?????
typeコマンドは本書に掲載されているものをそのままでなぜか動きました。
初アプリ
アプリというか、静的な機械語の実行ファイルをOSに保持させてそれをプログラムから呼ぶだけ。 19章ではhlt命令を実行するだけのプログラムを実行した。
$ cat hlt.nas [BITS 32] fin: HLT JMP fin
上記をアセンブルした下記をhariboteOS内にファイルとしてコピして呼ぶ。
$ hexdump -C hlt.hrb 00000000 f4 eb fd |...| 00000003
手順としては見つかったファイル内容をセグメントに登録してそこにfar jumpしておしまい。