東京で勝手に消耗してる

東京で勝手に消耗してる地方人の日々、思う事。あんまりいい話は無い。

自作OS 1日目

www.amazon.co.jp

これタイトルだけでめっちゃ面白そうですよね。

やり始めます。

1日目

アセンブラでディスクイメージを作る。

ディスクイメージとは、CDやDVD、ハードディスクなどの記憶装置に保管されているデータを、ファイルシステムの構造や制御情報などと一緒に丸ごと写しとって一つのファイルにしたもの。

単にすべてのファイルをコピーしただけでは、特殊な領域に記録されているブートに関連するデータや、OSがアクセスをブロックしている部分などはコピーできないが、ディスクイメージ作成ソフトなどを使うと、ディスクに記録されたすべてのデータをそのまま写しとってファイルに記録してくれる。

環境は本書ではWinでしたが私はMacなので以下を参考に進めます。

github.com

この章ではバイナリエディタを使ってディスクイメージを作る所からテキストエディタを使ってディスクイメージを作る所までをやります。

バイナリエディタでの作成は読むだけ(作るのかなり怠い

テキストエディタでの作成は以下。

; 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バイトあけておく

; プログラム本体

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, my OS"
DB 0x0a ; 改行
DB 0

RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令

DB 0x55, 0xaa

; 以下はブートセクタ以外の部分の記述

DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432

コメントなど入れた状態。 おまじない的なものがほとんど。まだよくわからないけどこれでもちゃんとしてOSとして起動しました。 メッセージ部分もちゃんと出力されてたし。

エミュレータで起動。 f:id:Landroid:20150901123250p:plain

www.amazon.co.jp