アセンブラを用いて hello world OS を
OS の理解を深めるために、自作 OS を作成する。
作業 OS は以下。
$ uname -a
Linux Ubuntu-SSD 4.10.0-33-generic #37~16.04.1-Ubuntu SMP Fri Aug 11 14:07:24 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
必要なパッケージのインストール
$ sudo apt-get install nasm qemu
アセンブラのソースコードは以下のもの。
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL"
DW 512
DB 1
DW 1
DB 2
DW 224
DW 2880
DB 0xf0
DW 9
DW 18
DW 2
DD 0
DD 2880
DB 0,0,0x29
DD 0xffffffff
DB "HELLO-OS "
DB "FAT12 "
TIMES 18 DB 0
; Program
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; message
DB 0x0a, 0x0a
DB "hello, My OS"
DB 0x0a
DB 0
TIMES 0x1fe-($-$$) DB 0
DB 0x55, 0xaa
; besides boot-sector
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 4600 DB 0
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 1469432 DB 0
起動してみる。
$ nasm helloos.asm -o helloos_asm.img
$ qemu-system-i386 helloos_asm.img
-> ちゃんと起動した!
アセンブラについて
- DB 命令: 1 バイト分の文字列を書き込む
- DW 命令: 2 バイト分の文字列を書き込む
- DD 命令: 4 バイト文の文字列を書き込む
- TIMES 0x1fe-($-$$) DB 0: 0x1fe まで 0 で埋める
このように指定しなければ 510 バイトめに 0x55AA が来なくなる可能性がある。起動時はディスクの最初のセクタをまず見るが、最初のセクタの最後の 2 バイトが 0x55AA でなければ起動に必要なプログラムが書かれていないと判断される。
ちなみに最初の記述の意味は以下。
- DB “HELLOIPL”: ブートセクタの名前
- DW 512: 1 セクタの大きさ
- DB 1: クラスタの大きさ
- DW 1: FAT がどこから始めまるか
- DB 2: FAT の個数
- DW 224: ルートディレクトリ領域の大きさ
- DW 2880: ドライブの大きさ
- DB 0xf0: メディアのタイプ
- DW 9: FAT 領域の大きさ
- DW 18: 1 トラック内のセクタ数
- DW 2: ヘッド数
- DD 0: パーティション数
- DD 2880: ドライブの大きさ ( もう一度 )
- DB 0,0,0x29: 不明
- DD 0xffffffff: ボリュームシリアル番号
- DB “HELLO-OS ” ディスクの名前
- DB “FAT12 ”: フォーマットの名前