更新: 2022.11.20
OSDev.org: https://wiki.osdev.org/Expanded_Main_Page
とりあえず、内容の簡単な説明だけでも...
このページの内容はOS開発と関連します。
はるか昔、CPUが 8086 という16ビットだったころは、
コレが主流だったと思われますが...
このページでは、コンピュータの電源投入時に起動される
最初の起動プログラムの作り方についてやります。
(現在では、ブートローダと呼ばれるもの。 OSではない)
コンピュータに搭載されている BIOS という基本機能を使い、
16ビットのアセンブリ言語でこの BIOS を操作してプログラミングします。
nasm を使いソースをアセンブルします。
nasm -f bin test1.asm -o test1.bin
起動プログラムを実際に実行するには、
ディスク上の MBR 領域に、プログラムを配置する必要があります。
しかし、いま使っているパソコンのハードディスクを書き換えてしまうと
もとのブートローダが起動できなくなってしまうことと、
実行するたびに書き換え・再起動という手間がかかるのが非常に面倒です。
なので、プログラムを簡単にテストするために PC エミュレータを使用します。
QEMU を使えば手軽に実行できます。
qemu-system-i386 -fda test1.bin
何もしなくても、最低限、起動できて実行可能なもの。
hang: jmp hang times 510-($-$$) db 0 db 0x55 db 0xAA
jmp hang というのは、ジャンプ命令で、
プログラムの実行番地を指定の番地 (ここでは hang という番地)
までジャンプします。
これは同じところをぐるぐる回っているだけです。
OSが管理するプログラムは終了するとシステムに帰るという機能がありますが、
そうでないプログラムは途中で停止などできないため、
どこかで止めるには、このようにハングアップします。
このプログラムはディスクのMBR(マスターブートレコード、先頭の1セクタ)
に配置されます。
コンピュータは起動時にディスクの MBR を見て起動可能と判断される
場合には、その MBR の内容をメモリ上のアドレス 0x7C00
に配置し実行します。
1セクタ = 512 バイトなので、生成されるバイナリファイルの大きさが
512 バイトになるようにし、最後の2バイトに 0x55, 0xAA
というデータを配置します。
これによりブート可能なプログラムが MBR に配置されているということが
認識されるようになります。
このソースの後半部分がそれをやっています。
基本的なことは上記の通りですが、
これだと本当に正常に動いているものかどうか分かりません。
次に1文字出力の BIOS コールを使って、文字を出力する例をやります。
; Hello! と表示する部分 mov ah, 0x0e mov al, 'H' int 0x10 mov ah, 0x0e mov al, 'e' int 0x10 mov ah, 0x0e mov al, 'l' int 0x10 mov ah, 0x0e mov al, 'l' int 0x10 mov ah, 0x0e mov al, 'o' int 0x10 mov ah, 0x0e mov al, '!' int 0x10 ; 改行コード出力 mov ah, 0x0e mov al, 0x0d int 0x10 mov ah, 0x0e mov al, 0x0a int 0x10 ; 終了 hang: jmp hang times 510-($-$$) db 0 db 0x55 db 0xAA
1文字ずつの出力なので分かりづらいかもしれませんが、
Hello! と出力したあと、改行コードも出力しています。