2014年9月15日月曜日

[OS作成]30日でできる!OS自作入門 2日目 (2)

書籍では、BIOSの解説ページ
http://community.osdev.info/?(AT)BIOS
が紹介されているが、SPAM業者?か何かに書き換えられているようで、
変なリンクがたくさん表示されおり、肝心の情報は何もない。

うーむ。どこを見れば良いかな?
探してみた。

このページが良いかな?
Interrupt Jump Table

知りたい割り込み番号をクリックすると詳細を表示できる。
例えば、今回、使っている int $0x10 は、
http://www.ctyme.com/intr/int-10.htm
であり、AX=$0x0Eについては、
http://www.ctyme.com/intr/rb-0106.htm
が、詳細情報である。

書籍と同様に、開発しやすくなるように、Makefileを作ることにしよう。

疑問点が一つある。
ブートセクタ以降に、以下のコードを書いていたが、これは何だろう。
以下のように編集して、ブートセクタ以降を全て0x00にしたイメージを使い、qemuで動作確認してみたが、問題なく動いた。
 .org 0x1FE
 .byte 0x55, 0xAA # 55AAでブートセクタ

// ブートセクタ以降
 
// .byte 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 .space 4600
// .byte 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
 .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 .space 1469432
とりあえず気にせずに、このまま進めよう。

作成したMakefileは以下の通り。
image_file=helloos.img

ipl.bin: ipl.s lnk.ls
 gcc -nostdlib -o $@ -Tlnk.ls ipl.s
 gcc -Tlnk.ls -c -g -Wa,-a,-ad ipl.s > ipl.lst

zero.img:
# 1474560 - 512 = 1474048
 dd if=/dev/zero of=zero.img ibs=512 count=2879

image_file: ipl.bin zero.img
 cat ipl.bin zero.img > ${image_file}

img:
 make image_file

run:
 qemu-system-i386 -m 32 -localtime -vga std -fda ${image_file}

リスティングファイル(アセンブル結果)を出力するには、gccの-Wa,-aオプションを渡して、asコマンドのリスティング出力を有効にする。

書籍では、独自コマンドを使って、イメージを作成していたが、
catコマンドで
(1)gccで作成した512バイトのブートセクタイメージ
(2)1.44Mバイト-512バイト(ブートセクタ分)のサイズを0で埋めたファイル
を連結して作成している。


これで、次のターゲットを利用できるようになった。

イメージファイルを作成する。
$ make img

作成したイメージをqemuを起動する。
$ make run

参考