2日目
ipl.s
前回まで、helloos.sという名前でアセンブラを書いていましたが、
ファイル名をipl.sに変更しました。下記に変更後のソースを示します。
.code16 # 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 jmp entry .byte 0x90 .ascii "HELLOIPL" # ブートセクタの名前(8バイト) .word 512 # 1セクタの大きさ .byte 0x01 # クラスタの大きさ .word 1 # FATの開始位置(普通は、1セクタ目から) .byte 0x02 # FATの個数 .word 224 # ルートディレクトリ領域の大きさ(224エントリ) .word 2880 # このドライブの大きさ .byte 0xf0 # メディアのタイプ .word 9 # FAT領域の長さ .word 18 # 1トラックにあるセクタ数 .word 2 # ヘッドの数 .int 0 # パーティションの個数(未使用なので0) .int 2880 # このドライブの大きさをもう一度書く .byte 0x00, 0x00, 0x29 # ?? .int 0xffffffff # ボリュームシリアル番号 .ascii "HELLO-OS " # ディスクの名前(11バイト) .ascii "FAT12 " # フォーマットの名前(8バイト) .skip 18, 0x00 # ?? #プログラムの本体 entry: movw $0, %ax movw %ax, %ss movw $0x7c00, %sp movw %ax, %ds movw %ax, %es movw $msg, %si putloop: movb (%si), %al addw $1, %si cmpb $0, %al je fin movb $0x0e , %ah #1文字表示 movw $15, %bx #カラーコード
新しいgasの命令
命令 | 説明 |
.code16 | 16bit用のバイナリを吐く。 |
mov | 代入命令です。オペランドが1バイト(8bit)なら"b"、2バイト(16bit)なら"w"、4バイト(32bit)なら"l"、8バイト(64bit)なら"q"です。 |
$ラベル | ラベルのアドレスを意味する |
(レジスタ) | レジスタの数値を利用する |
cmp | 値を比較する。これもb, w, l, qがつくらしい。 |
je | 指定したラベルへ飛ぶ。 |
※GASではデフォルトではAT&T記法なので、Intel記法のアセンブラと
ソースオペランドとデスティネーションオペランドが逆になっているのに注意。
(例) AT&T:movw $0, %ax → Intel:mov ax, 0
あとはOS自作本通りの説明です。
INT命令
本にあったページです。
http://community.osdev.info/index.php?%28AT%29BIOS
メモリマップ
本にあったページです。
http://community.osdev.info/index.php?%28AT%29memorymap
makefile
今回からmakefileを導入します。下記のようにしました。
make allでエミュレータ起動までやってくれます。
IMG=helloos.img IPL=ipl.bin all: make ipl make img make run img:${IPL} cat ${IPL} > ${IMG} ipl:ipl.s gcc -nostdlib -o ${IPL} ipl.s -Tipl.ls run:${IMG} qemu -fda ${IMG} clean: rm -rf ${IMG} ${IPL}
インストール用のスクリプト
USBへのインストールで書いてた内容をスクリプト化しました。
#!/bin/bash ###################### #インストールスクリプト #管理者で実行すること ###################### #必要なら下記値を書き換えること export IMG=helloos.img export USB_DEV=/dev/sdc1 dd if=${IMG} of=${USB_DEV}
今後の予定
完成したら、知識を整理するという意味でもWikiでも作成しようかと思っています。