OS自作3日目
Debian statableパッケージ縛り(?)のOS自作入門2日目ですが,3日目を読んでおります.
セクタを読むあたりはサクサクなんですが,
本体を書き始めるあたりで詰まった.
イメージに書きこむには,イメージをマウントすればよいかなと思って
# losetup /dev/loop0 イメージ
# mount -t vfat /dev/loop0 /mnt/fd0
ってしてみたけど.
なんかだめっぽい.
ファイルシステムがダメらしい.
試しに一番最初のhelloos.imgを使ってみるとちゃんとマウントできる.
さて,何がおかしいのか.
まず,パーティションテーブルを全部0にしてたので,
2日目のアセンブリから戻してみる.
コメント付け加えてます.
でもやっぱりちがうみたい.
バイナリを見比べてみると,
先頭3バイト目あたりがちがう.
アセンブリの命令だと,JMP entry のあたりか.
そこを
DB 0xeb, 0x4e
に替えてみるとマウントできました.
やったね.
JMP entry だとアドレスが32bitでアセンブルされてしまうのかな.
0x4eは固定で大丈夫そうだし,このままでいけそう.
Makefileにはinstallターゲットの代わりに
を書いておこう.
あと,デフォルトの動作にmountとcpとumountする動作加えてもいいかも.
0x4400に書きこまれていたのが少し気になるが,
とりあえず0xc200を0xc400に替えて無事起動できた.
gasからnasmへの変換はintel2gasの-gオプションがうまくやってくれるみたいです.
セクタを読むあたりはサクサクなんですが,
本体を書き始めるあたりで詰まった.
イメージに書きこむには,イメージをマウントすればよいかなと思って
# losetup /dev/loop0 イメージ
# mount -t vfat /dev/loop0 /mnt/fd0
ってしてみたけど.
なんかだめっぽい.
ファイルシステムがダメらしい.
試しに一番最初のhelloos.imgを使ってみるとちゃんとマウントできる.
さて,何がおかしいのか.
まず,パーティションテーブルを全部0にしてたので,
2日目のアセンブリから戻してみる.
; FATテーブルの初期化
; File Allocation Table の先頭
; 0xFF0 : 3.5 inch FD, 0xFFF : End of Cluster
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600 ; 9セクタ分(FAT領域)
; 予備 File Allocation Table の先頭
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1474560-($-$$)
コメント付け加えてます.
でもやっぱりちがうみたい.
バイナリを見比べてみると,
先頭3バイト目あたりがちがう.
アセンブリの命令だと,JMP entry のあたりか.
そこを
DB 0xeb, 0x4e
に替えてみるとマウントできました.
やったね.
JMP entry だとアドレスが32bitでアセンブルされてしまうのかな.
0x4eは固定で大丈夫そうだし,このままでいけそう.
Makefileにはinstallターゲットの代わりに
mount :
losetup /dev/loop0 $(IMAGE)
mount -t vfat /dev/loop0 /mnt/fd0
umount :
umount /mnt/fd0
losetup -d /dev/loop0
を書いておこう.
あと,デフォルトの動作にmountとcpとumountする動作加えてもいいかも.
0x4400に書きこまれていたのが少し気になるが,
とりあえず0xc200を0xc400に替えて無事起動できた.
gasからnasmへの変換はintel2gasの-gオプションがうまくやってくれるみたいです.