VirtualBoxという仮想化ソフトを使えば別のOSを動かせると聞いたのでMacBookAirで試してみた。 Ubuntuのisoイメージ(ubuntu-ja-12.10-desktop-i386.iso)をダウンロードして食わせてみると、そこそこの速度で動く。すごいね。

これを使えば「自作OS入門」を試せるんじゃないか?ということでアセンブラのソース:

; hello-os

        ORG     0x7c00

        JMP SHORT entry
        DB      0x90
        DB      "HELLOIPL"      ; Boot sector name (8 bytes)
        DW      512             ; Size of sector (Must be 512)
        DB      1               ; Size of cluster (Must be 1)
        DW      1               ; FAT start
        DB      2               ; FAT count
        DW      224             ; Size of root dir
        DW      2880            ; Size of this media (Must be 2880)
        DB      0xf0            ; Media type (Must be 0xf0)
        DW      9               ; FAT length
        DW      18              ; Number of sector in a track
        DW      2               ; Number of head
        DD      0               ; No partition
        DD      2880            ; Drive size
        DB      0,0,0x29        ; Magic
        DD      0xffffffff      ; Volume serial number
        DB      "HELLO-OS   "   ; Disk name (11 bytes)
        DB      "FAT12   "      ; Format name (8 bytes)
        TIMES 18 DB 0

entry:
        MOV     AX,0
        MOV     SS, AX
        MOV     SP, 0x7c00
        MOV     DS, AX
        MOV     ES, AX

        MOV     SI, msg
putloop:
        MOV     AL, [SI]
        ADD     SI, 1
        CMP     AL, 0
        JE SHORT fin
        MOV     AH, 0x0e        ; Function: put 1 char
        MOV     BX, 15          ; Color code
        INT     0x10
        JMP SHORT putloop
fin:
        HLT
        JMP SHORT fin

msg:
        DB      0x0a, 0x0a
        DB      "hello, world"
        DB      0x0a
        DB      0

        TIMES 0x01fe-($-$$) DB 0   ; Fill 0x00 until 510 byte
        DB      0x55, 0xaa      ; Marker

nasmでアセンブルし、そしてフロッピーディスクのイメージとしてサイズが合うように、後ろを0x00で埋める:

nasm -o helloos.img helloos.asm && ruby -e 'print "\0" * (0x168000-0x200)' >> helloos.img 

できたファイルをVirtualBoxに食わせてやる。VirtualBoxでゲストOSを新規に追加、そのときタイプを”Other”、バージョンを”Other/Unknown”にする

「設定」>「ストレージ」で、「フロッピーコントローラ」を追加して、ディスクイメージとして先ほど作ったhelloos.imgを指定する

そして「起動」を選ぶと、めでたく実行された

Mac上で動くQというqemuがあって、そちらでも動かすことができた

これらのエミュレータを使って、C言語で自作OSを…と思ったが、C (gcc) からコンパイル結果のバイナリを取り出す方法が、Xcodeを入れた時に入るgccがAppleの作った?llvmのもので、リンカのld が -Tオプションでリンカスクリプトを受け付けなくて、うまい取り出し方法がわからなかった…orz

じゃあってことでVirtualBox上で動かしたUbuntuにqemuを入れて、それで自作OSを動かそうとすると、立ち上がるんだけど何度もリセットがかかってウィンドウが閉じたり開いたり、そしてウィンドウ内のフォントの大きさが切り替わってまともに動かない…なにこれどうしたらいいの。

参考になりそうなページ