macOS で試す OS自作入門(1日目その2)

OS自作入門

前回に引き続き、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

コメント

タイトルとURLをコピーしました