読者です 読者をやめる 読者になる 読者になる

OS自作3日目

OS自作
Debian statableパッケージ縛り(?)のOS自作入門2日目ですが,3日目を読んでおります.

セクタを読むあたりはサクサクなんですが,
本体を書き始めるあたりで詰まった.

イメージに書きこむには,イメージをマウントすればよいかなと思って
# 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オプションがうまくやってくれるみたいです.