前回に引き続き、macOS で試す OS自作入門の続きです。
mac で試す OS自作入門(1日目)
https://nomad.office-aship.info/mac-os1
30日でできる! OS自作入門 – 2006/3/1
いろいろ調べていたら、同じく本書を macOS 上で実行しようとしている猛者が何人かいるようです。
素晴らしいですね。
『30日でできる!OS自作入門』を macOS Catalina で実行する
https://qiita.com/noanoa07/items/8828c37c2e286522c7ee
上記記事を参考に、やってみたいと思います。
著者作成のアセンブラ nask の代わりに NASM を使います。
NASM のインストール
% brew install nasm
バージョン確認
% nasm -v NASM version 2.15.05 compiled on Oct 22 2021
1つ目のソースは、
DB(Data Byte)命令という、任意のバイト列をそのまま実行コードに埋め込む命令を使って、前回のバイナリ列を直接出力しています。
helloos1.nas
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 ;RESB 16 TIMES 16 DB 0 ; NASMでは警告が出るので修正 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, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 ;RESB 368 TIMES 368 DB 0 ; NASMでは警告が出るので修正 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 ;RESB 4600 TIMES 4600 DB 0 ; NASMでは警告が出るので修正 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 ;RESB 1469432 TIMES 1469432 DB 0 ; NASMでは警告が出るので修正
これを NASM でコンパイルして
% nasm helloos1.nas -o helloos1.img
実行
% qemu-system-x86_64 -fda helloos1.img
このように Hello World と出力されれば成功
もう一つのやり方はこちら
DB命令以外を使った、アセンブラっぽい書き方です。
こちらの方が、中身を理解しやすいですね。
helloos2.nas
; hello-os ; TAB=4 ; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述 DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; ブートセクタの名前を自由に書いてよい(8バイト) DW 512 ; 1セクタの大きさ(512にしなければいけない) DB 1 ; クラスタの大きさ(1セクタにしなければいけない) DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする) DB 2 ; FATの個数(2にしなければいけない) DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする) DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない) DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない) DW 9 ; FAT領域の長さ(9セクタにしなければいけない) DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない) DW 2 ; ヘッドの数(2にしなければいけない) DD 0 ; パーティションを使ってないのでここは必ず0 DD 2880 ; このドライブ大きさをもう一度書く DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい DD 0xffffffff ; たぶんボリュームシリアル番号 DB "HELLO-OS " ; ディスクの名前(11バイト) DB "FAT12 " ; フォーマットの名前(8バイト) ;RESB 18 ; とりあえず18バイトあけておく TIMES 18 DB 0 ; NASMでは警告が出るので修正 ; プログラム本体 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 ; メッセージ部分 DB 0x0a, 0x0a ; 改行を2つ DB "hello, world" DB 0x0a ; 改行 DB 0 ;RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令 TIMES 0x1fe-($-$) DB 0 ;NASM用に修正 $から$-$に、RESBからTIMES DB0へ DB 0x55, 0xaa ; 以下はブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 ;RESB 4600 TIMES 4600 DB 0 ; NASMでは警告が出るので修正 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 ;RESB 1469432 TIMES 1469432 DB 0 ; NASMでは警告が出るので修正
これを NASM でコンパイルして
% nasm helloos2.nas -o helloos2.img
実行
% qemu-system-x86_64 -fda helloos2.img
同じようにに Hello World と出力されれば成功です。
その他のOS自作本
ゼロからのOS自作入門 – 2021/3/22
コメント