VirtualBoxやQemuで自作OSの第2章まで

2013-02-27

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を動かそうとすると、立ち上がるんだけど何度もリセットがかかってウィンドウが閉じたり開いたり、そしてウィンドウ内のフォントの大きさが切り替わってまともに動かない…なにこれどうしたらいいの。

参考になりそうなページ