Yabu.log

色々勉強するブログです。

30日OS自作本19日目

19章の内容です。typeコマンドでOSにコピーしたファイルの読み込みと、ファイルとしてコピーした機械語の実行を行いました。

f:id:yuyubu:20180612052308p:plain

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しておしまい。

感想

  • コンソールにスクロール機能が付いていないので大きいファイルをtypeコマンドで表示した場合、先頭の方のデータがわからない。
  • typeコマンドで断片化したファイルの表示ができたら面白いと思う
    • ファイルを書き込んでも必ず断片化されるわけではないので、用意が大変そう。バイナリを直接いじるのが良さそう?
  • FAT12デフラグするプログラムも書くイメージが湧いた

    • ディスクのフォーマットに依存する
  • doxygen(c言語javadoc的なやつ)的なのが付いていないから、数週間ぶりに関数などを見ると使い方を忘れる。