自分でOSを1から作ってみる Advent Calendar 2024の2日目です。
今日の目標
今日はとりあえずPCを起動したら自動で実行されるソフトフェアを作成していきたいと思います。そのためにまずブートセクタを作成して、それをディスクイメージに書き込むところまでやっていこうと思っています。
まず環境構築
まずは面倒な環境構築から片づけてしまいましょう。今回はNASM,QEMUをインストールしていこうと思います。言い忘れていましたがこの記事ではwindows向けに説明していきます。この部分はあまりこの記事においては重要ではないので、あまり詳しくは説明しません。分からなければググるかchatgptにお尋ねください。
NASMの環境構築
- NASMの公式ページにアクセスする
- Downloadのページに行って、ダウンロードしたいバージョンのフォルダにアクセスする
- 適切な(例:win64)フォルダに移動し、installer.exeみたいなやつをダウンロードする
- ダウンロードしたexeファイルを実行する
- 設定から環境変数を開き、PathのところにさっきexeファイルでインストールしたNASMのPath(例:C:\Users\froms\AppData\Local\bin\NASM)を入力する。再起動すると適用されるはずです
-
nasm-v
を実行してみてNASMのバージョンが表示されれば設定は完了です
qemuの環境構築
qemuの環境構築もほぼNASMの環境構築と同じなのですが、一応やっておきましょう
- QEMUの公式ダウンロードページに移動する
- 32ビットか64ビットか選択して一番下の方にあるexeファイルをダウンロードします
- ダウンロードしたexeファイルを実行してください。残念ながら日本語はありません。
- 3でインストールしたフォルダをnasmと同じようにPathを通してください。
-
qemu-system-i386 --version
を実行してみてQEMUのバージョンが表示されれば成功です。
とりあえずブートセクタを作ろう
どういう仕組みなのかを説明する前にまずは早速作ってしまいましょう。
まず、下のコードをテキストエディタで書き、「boot.asm」という名前で保存しましょう。この時デスクトップかなんかに適当なフォルダを1つ作っておき、そこに保存するといいでしょう。
org 0x7C00 ; ブートセクタのアドレス
start:
mov ax, 0xB800 ; テキストモードのビデオメモリのセグメントアドレス
mov es, ax
mov di, 0 ; ビデオメモリの先頭位置(画面の左上)
mov si, message ; メッセージの先頭アドレスをSIに設定
print_char:
lodsb ; メモリから1バイトをALにロード
cmp al, 0 ; 終端をチェック
je hang ; 終端なら停止
mov [es:di], al ; 文字をビデオメモリに書き込む
inc di ; 次のビデオメモリ位置へ
mov byte [es:di], 0x07 ; 文字の色(白)
inc di
jmp print_char ; 次の文字へ
hang:
jmp $ ; 無限ループで停止
message db "hello, world", 0 ; 表示するメッセージ
times 510-($-$$) db 0 ; 残りのバイトをゼロで埋める
dw 0xAA55 ; ブートセクタ署名
次に、「boot.asm」を作成したフォルダでターミナルを開き、以下のコマンドを実行してください。
nasm -f bin boot.asm -o boot.bin
もうこれでOS(?)はとりあえず作れました。なので早速実行していきましょう。
でも実際のPCで実行するのはいろいろと面倒なので、とりあえず仮想環境で実行してみましょう。下のコードを実行してください
qemu-system-x86_64 -drive format=raw,file=boot.bin
すると、下のような画面が表示されるはずです。
とはいえ、まだOSを作れたとは言い難いと思います。なぜなら、今作った部分はOS本体ではなくOSをメモリに読み込むために使うブートセクタという部分だからです。
次は今回やったことの説明をしようと思います。それが終わったらOS本体の制作に取り掛かっていきたいと思います。