30日でできる! OS自作入門を読み始める

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

職が見つかるまで試してみようかと。

ってことで、図書館で借りてきた。強風の中。
IMG_1835IMG_1838

機会があったら読んでみようと思ってから6年も経ってるのか。。
を読み終えるのが先か、職が見つかるのが先か、果たして。(挫折する可能性も大いに有り)

1日目

フロッピーディスクイメージを手書きで作る模様。
馬鹿正直に書いてみる。
20120403_171951_120120403_185231_1

付属のQEMUで動かしてみる。
20120403_183740_1

でも動かしてみる。
20120403_184307_120120403_184318_120120403_184401_120120403_184425_1

次は、手書きで書いたものを、アセンブラで書くとのこと。

NASMっぽい文法のというアセンブラを使う模様。NASMより最適化能力が優れているとのこと。

GO/nask – OS-Wikiによると、
naskは、GO(じーおー)の一部。GO(じーおー)は、IA-32用の汎用gcc。GO – OS-Wiki

本の通りに、18万行超のコードを書いて(実際は、QuickBEの変換を使っただけだが)、
naskでアセンブルしようとしたら、でかすぎるって怒られる。

仕方ないので、RESBを使うコードを試す。
helloos.

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は、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: 相違点は検出されませんでした

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

DW: Data Word。指定された値をワード(2byte)として書き込む
DD: Data Double word。指定された値をダブルワード(4byte)として書き込む

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

が特殊で、$は、現在の位置を表すから、現在の位置から、0x1feまでゼロ埋め出来るらしい。
$は他の意味もあるらしく、それは2日目以降のお楽しみとの話。

カテゴリー: ソフトウェア タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です