【OS】 自前カーネル開発の準備(仮想マシン編)

何を思い立ったかIA-32ベースの自前組み込み系カーネルを開発すべく実験を始めてみました。
とりあえずx86系プロセッサの最低限の知識はあるしアセンブラも書けるんで、この辺りは問題ない。
となると問題は環境面(ツール面)ですな。
どうやってやるべきかと色々調べてみました。

もちろん、この開発用にPCを用意すれば良いのだけど、開発中に一々別のPC触るのも面倒やし、大体そんな余剰なPCは手元にないので(いや、あるか…LOOXが…[E:coldsweats01])できればシミュレータで済ましたいわけですわ。

普段はWIndowsXPを動かすのにVMwareを使ってるんで、最初の案はVMwareでFDから起動させる事。
今のマシンはFDドライブなんて付いてないんやけど、VMwareならFDイメージから起動できるんで問題なしやなぁ。
周辺デバイスも問題なく使えるし、こりゃええかも。

と、さっそく512ByteのMBR用プログラムを作成して、nasmでアセンブル。
あ、ちなみにnasm 0.99.06は ubuntu 8.04 LTS のパッケージとして提供されています。
パッケージマネージャで、「nasm」で検索すると出てくるはず。
カーネル開発には必須なので、要インストールですわ。

作成したバイナリを先頭に配置したFDイメージを作成する。
ここでは面倒やったので、バイナリエディタ(KHexEdit)を使って 1474560 バイトのファイルを作成してみました。
最初の512バイトに上記のアセンブル結果、後ろ1474048バイトを0埋めしときゃ大丈夫。

できあがったFDイメージファイルをマウントして、さぁ実験…。

Screenshottest_sun_xvm_virtualbox

こんな感じで、無事MBRから作成したプログラムが起動して左上に青バック、白文字で「TEST」と表示できました。
VMwareだったら動作も安心やし、色々と利点はある。
あるけど、今回の目的にはちょっとそぐわない。

というのは、ソフトの開発中は開発効率が最重要なんやけど、VMwareで起動するためにはマウスで起動ボタンをポチポチしなければならへん。
もちろんキーボードショートカットもあるやろうけど、どちらにしてもちょっと面倒なんですわ。[E:think]

他になにかないかな〜っとさがしてたら、IA-32シミュレータのQEMUとbochsを発見。
どちらも同じようなソフトウェアシミュレータですな。
VMwareはホストPCのハードウェア(プロセッサと周辺)を利用してゲストプログラムを起動するので非常に高速。
それに比べて、これらのソフトウェアシミュレータは、完全ソフトウェアでプロセッサの挙動をシミュレーションするので低速なわけです。
どうやらこれらのシミュレータはサイクルシミュレータらしく、かなり厳密にシミュレーションしてくれそう。
仕事柄、僕自身もプロセッサのソフトシミュレータを作ったりするのやけど、さすがにIA-32のシミュレータは手がで〜へんなぁ。
開発者様には脱帽ですわ。

で、今度はbochsを使ってみる事にしました。
ubuntuではbochsもパッケージが用意されているようで非常に楽。
パッケージマネージャで bochs として検索して、表示されるパッケージを全てインストールします。
この時、vgabios も忘れずに。

Screenshotsynaptic_2

こんな感じですわ。
bochsは /usr/bin/bochs にインストールされるみたい。
あと必要なものとしては、BIOSイメージとvgaromイメージ、それからbochsの設定ファイル。

BIOSイメージ      /usr/share/bochs/BIOS-bochs-legacy
vgaromイメージ   /usr/share/vgabios/vgabios.bin

が使えます。
それから設定ファイル。
bochsはカレントディレクトリに bochsrc というファイルがあると、それを設定ファイルとして読み込んでくれるみたい。
そこで、以下のような内容のbochsrcを作成する。

romimage: file=/usr/share/bochs/BIOS-bochs-legacy, address=0xf0000
megs: 32
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=fd.img, status=inserted
boot: floppy
floppy_bootsig_check: disabled=1
mouse: enabled=0
fullscreen: enabled=0

このファイルを保存したディレクトリで

$ bochs

とすると、bochsが起動してさっき作成したFDイメージのMBRからブートローダを読み出して起動してくれる。
で、実行した結果が↓

Screenshotbochs_x8664_emulator_http

はい。見事にVMwareと同じ画面が表示されました。[E:wink]

取り合えず、今日はこの位にするかな?
環境整備という面ではアセンブル後のバイナリからFDイメージを作成する所も自動化してmake一発で起動テストまでできるようになるから、かなり良い感じ。当面は速度のペナルティは見えなさそうやしね。むしろ早いかもしれへん。[E:confident]

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください