コツコツやらない小6がVirtualBoxで「30日でできる!OS自作入門」をやり遂げる話。1日目


追記 12/7 公開してから一年の月日が経ちました。早いですね。僕もこの一年に色々な経験をしていました。
記事を挙げた二日目には止まってしまったこのシリーズ。でも僕は諦めてません。絶対に戻ってきます。絶対に次の記事を書いて30日目までがんばります。少し待っていてください。(12月中にリニューアルさせたい)
あと実は9日目くらいまでは完成していたのですがあんまり仕組みがわかってないです()

自己紹介

はじめまして。色んなことに挑戦してエラーで諦めてしまう小6のtatsuです。文章の所々間違っていると思いますがよろしくです。

環境構築

VirtualBox https://www.oracle.com/technetwork/jp/server-storage/virtualbox/overview/index.html
バイナリエディタ Hex Fiend https://ridiculousfish.com/hexfiend/
VirtualBoxで起動する時のやり方はこちらの方が詳しく書いていますのでそちらをご覧ください https://qiita.com/nao18/items/e1b9b77f154e4d5239e5
mac用nask https://shrimp.marokun.net/osakkie/wiki/?tolsetOSX

やってみる

まずhelloos.imgというディスクイメージを作ります。起動すると画面に「hello, world」と出るらしいです。バイナリエディタを使うのは初めてでアプリに関しても使いにくいなと思いました。筆者はmacで作業しているのですが、探してもいいエディタが見つからず、引っ越しを転々と続けています。

ここから、VirtualBoxを起動したのですが問題発生。なぜか、<がずっと表示され続けています。やめてくれよ....(筆者、エラーにはとことん弱い)

それもそのはず。一回読み間違えてしまい、60〜70らへんで二回も打ち続けてしまいました。これ判明するの1時間後ってマ?そして答えが分かったところでコードの書き換えをし、無事起動することができたとか。

アセンブラでhello workを出してみる

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

; プログラム本体

        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

なんで拡張子がnasなのかと言いますと、本の執筆者さんが「nask」というアセンブラを作ったそう。たまげたなぁ...あ、ちなみにmacでCatalinaの場合はこのnask使えません。このnaskは32bit版しかなく、Catalinaは32bitに対応していないため私的には詰んでいるかと...残念ですが...
では早速起動してみましょう!!!

ちゃんと起動することができました!正直難しすぎてよくわからないのは内緒です。

 /|_________ _ _
〈  To BE CONTINUED…//// |
 \| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄~ ~  ̄

次回 https://qiita.com/gorira_tatsu/items/c1ae1d15c2946a90e042

追記

11/24日追加
せっかくなので、Twitterアカウントを開設してみようと思います。今回父に、有名なエンジニアが紹介したと言われて、そのように、エンジニアさんとも繋がりたいなと思ったからです。アカウント名はこちらです。
@GoriraTatsu