この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
職が見つかるまで試してみようかと。
機会があったら読んでみようと思ってから6年も経ってるのか。。
os自作入門を読み終えるのが先か、職が見つかるのが先か、果たして。(挫折する可能性も大いに有り)
1日目
フロッピーディスクイメージを手書きで作る模様。
馬鹿正直に書いてみる。
vmwareでも動かしてみる。
次は、手書きで書いたものを、アセンブラで書くとのこと。
NASMっぽい文法のnaskというアセンブラを使う模様。NASMより最適化能力が優れているとのこと。
GO/nask – OS-Wikiによると、
naskは、GO(じーおー)の一部。GO(じーおー)は、IA-32用の汎用gcc。GO – OS-Wiki
本の通りに、18万行超のコードを書いて(実際は、QuickBEの変換を使っただけだが)、
naskでアセンブルしようとしたら、でかすぎるって怒られる。
仕方ないので、RESBを使うコードを試す。
helloos.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
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
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
DB 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
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
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
DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
DB 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
DBは、Data Byte。
RESBは、REServe Byte とのこと。指定したバイトをゼロ埋め
アセンブル
C:\tools\devel\hariboteOS\work>..\tolset\z_tools\nask.exe helloos.nas helloos.img
C:\tools\devel\hariboteOS\work>dir
ドライブ C のボリューム ラベルは 1st です
ボリューム シリアル番号は 4ECF-B009 です
C:\tools\devel\hariboteOS\work のディレクトリ
2012/04/03 22:46 <DIR> .
2012/04/03 22:46 <DIR> ..
2012/04/03 18:34 1,474,560 fdimage0.bin
2012/04/03 22:47 1,474,560 helloos.img
2012/04/03 19:27 962 helloos.nas
3 個のファイル 2,950,082 バイト
2 個のディレクトリ 79,016,374,272 バイトの空き領域
C:\tools\devel\hariboteOS\work>fc /b helloos.img fdimage0.bin
ファイル helloos.img と FDIMAGE0.BIN を比較しています
FC: 相違点は検出されませんでした
C:\tools\devel\hariboteOS\work>dir
ドライブ C のボリューム ラベルは 1st です
ボリューム シリアル番号は 4ECF-B009 です
C:\tools\devel\hariboteOS\work のディレクトリ
2012/04/03 22:46 <DIR> .
2012/04/03 22:46 <DIR> ..
2012/04/03 18:34 1,474,560 fdimage0.bin
2012/04/03 22:47 1,474,560 helloos.img
2012/04/03 19:27 962 helloos.nas
3 個のファイル 2,950,082 バイト
2 個のディレクトリ 79,016,374,272 バイトの空き領域
C:\tools\devel\hariboteOS\work>fc /b helloos.img fdimage0.bin
ファイル helloos.img と FDIMAGE0.BIN を比較しています
FC: 相違点は検出されませんでした
DBとRESBだけのソースを、それっぽく書き換えたのが、↓だそうだ。
; 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, world"
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
; 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, world"
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
DW: Data Word。指定された値をワード(2byte)として書き込む
DD: Data Double word。指定された値をダブルワード(4byte)として書き込む
RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令
が特殊で、$は、現在の位置を表すから、現在の位置から、0x1feまでゼロ埋め出来るらしい。
$は他の意味もあるらしく、それは2日目以降のお楽しみとの話。