でこてっくろぐ ねお

でこてっくろぐ(http://dekokun.github.io/)から進化しました。でこらいふろぐ(http://dekolife.hatenablog.com/)の姉妹版。デコテックログ(deko tech log)である

30日でできる! OS自作入門をMac + VirtualBoxでやり始めた

Turing Complete FM #2 を聞いていて、もっとCPUやOSに詳しくなったら楽しいだろうなという気持ちになったけど何からすればいいか皆目検討がつかず調べたら、OS自作という観点では 30日でできる! OS自作入門 | 川合 秀実 が名著と名高い 、ということが分かったので購入して始めてみた。

書籍ではWindowsでの開発を対象とした方法が記載されており、Macではそのまま使えないためGitHub - sandai/30nichideosjisaku: 『30日でできる! OS自作入門』川合 秀実氏(著)のMacOSX開発環境を整えることができます を参考に環境を構築した。

ただ、GitHub - sandai/30nichideosjisaku: 『30日でできる! OS自作入門』川合 秀実氏(著)のMacOSX開発環境を整えることができますでは仮想化環境としてQ.appを使っているが、「30日でできる! OS自作入門」をMac向けに環境構築する - Qiita によればQ.appではそのうちエラーになるからhomebrewでqemuをインストールして使えと書いてあるで使おうとしたのだが、最初から動かない(追記: 以下 その後のqemu周り気付き に実は動いていた旨記載しました)…困った困った、ではVirtualBoxでやるかということでVirtualBoxコマンドラインを調べて動かしたら動いたのでそちらでやることにした。 以下のようなMakefileを用意して使っている。

{7:55}[2.1.7]~/HariboteOS/z_tools/virtualvox ➭ cat Makefile
OSNAME:=dekoos
IMGNAME:=img.img

.PHONY: default
default:
        VBoxManage createvm --name $(OSNAME) --ostype Other --register
        VBoxManage storagectl $(OSNAME) --name Floppy --add floppy
        VBoxManage storageattach $(OSNAME) --storagectl Floppy --device 0 --medium $(IMGNAME)
        VBoxManage startvm $(OSNAME)

.PHONY: remove
remove:
        VBoxManage unregistervm $(OSNAME) --delete

今のところかかった時間等

計5.5時間。以下の○日目というのは、書籍の章立ての名前であり、実際は以下を今日1日で終わらせている。

  • 仮想化環境の試行錯誤 2時間
  • 0日目30分
  • 1日目 1時間半
  • 2日目 1時間半

よくわからなかったところ

添付のアセンブラではMOV AH,0x0e INT 0x10BIOSのビデオサービスの1文字書き込み機能をループ内で使うことで文字列を書き込んでいたが、 Tips BIOSサービス割り込み ビデオサービス 文字列書き込み で調べると、AHレジスタ0x13 を書き込むと文字列書き込みができるっぽい?と思って以下のように書いて実行しようと思ったみたけど、naskがipl.nasからipl.binを生成するところでエラーになってしまった。

MOV      SI,msg
MOV     AH,0x13         ; 文字列表示ファンクション
MOV     ES,msg
INT     0x10            ; ビデオBIOS呼び出し

naskのエラーも特にメッセージ等もなく、そもそもnaskが何をやっているのかとかも含めてイマイチ詳しく分かっていないし、また後々分かってくることも多かろうということで今はスキップ。 Tips BIOSサービス割り込み ビデオサービス にも 文字列書き込み Phoenix BIOS4.0 とあるので、そもそもBIOSが対応していないとかなのかな?

追記: 3日目のところを読んでいたら、セグメントレジスタという概念が出てきた。確かに、上記文字列書き込みのところにも、先頭アドレスは ES:BP というセグメントレジスタに書き込めという旨記載してある。なるほど、そこは完全に理解していなかった。少しずつ分かっていくぞ〜〜。

というわけで以下のように書いてみたら…naskは正常終了してOSの起動まではいったが、何も表示されず…うーん。なんだろ。まだまだ道は長い。

MOV      SI,msg
MOV     ES:BP,[SI]          ; msg指定
MOV     AH,0x13         ; 文字列表示ファンクション
INT     0x10            ; ビデオBIOS呼び出し

その後のqemu周り気付き

今このブログを書きながらもう一度qemuのコマンド打ったら、裏側でウインドウが出現していることに気付いた。朝に検証していた際は、そのウインドウに気づかず、"コマンド打ってどれだけ待っても何もおきない…"とか思ってたけど、実際は起動していたんだなぁ。まぁせっかくVirtualBoxで環境構築してみたのでそのまま行けるとこまで行ってみようと思いました。

意気込み

まぁ、ボチボチやっていこう。