|
本プロジェクトは,IA-
32アーキテクチャ (PC/AT互換機)
を対象とし,ネットワークを介して接続された計算機デバイスを,ローカル側の計算機から自由自在に操る技術を開発することを目的としている.ネットワーク
を介して利用可能なデバイスを,リモートデバイスと呼ぶ.
リモートデバイスを他のコンピュータから利用する方法を図2.3.1 VM層の仮想パスを用いたリモートデバイスの制御
に示す.コンピュータAに接続されているリモートデバイスを,コンピュータBから利用するために,まずコンピュータAおよびコンピュータBにそれぞれ本ソ
フトウェア (以下VM layerまたは単にVMと呼ぶ) を常駐させる.VMは,OS (VMの上なので,ゲストOSと呼ぶ)
の下層に位置する特殊なプログラムであり,あらかじめCPUの状態を適切な状態に設定しておき,OS側が発行するin,out命令および,そのほかのすべ
ての特権命令をトラップできるようになっている.
図 2.3.1 VM 層の仮想パスを用いたリモートデバイ
スの制御 
コンピュータBのOS
がコンピュータAにつながっているデバイスを利用しようとして,in,out命令を発行すると,直ちにCPUの保護機能が働き,VMに制御が移る.VMは
レジスタの値を読み出し,レジスタの値,およびCPUの状態を表すデータを独自プロトコルにてカプセル化し,コンピュータAのVMに送信する.データを受
け取ったコンピュータAのVMには,同マシンに接続されているNICにパケットが到達した時点で,割り込みによりOSから制御を奪う.送信されてきたデー
タを元に,デバイスにコマンドを発行して,結果をコンピュータBのVMに送り返す,コンピュータBのVMは,送り返された結果を使って,通常のin,
outが行われたのと同様にB上のOSを振る舞わせる.このようにして,Ethernet上に仮想的な内部バス,すなわち,仮想バスを作り出すことができ
る.なお,VMはPCエミュレータのように動作し,ゲストOSはVMの存在を意識することはない.
OSに仮想化されたハードウェアを提供するため,IA-32アーキテクチャのエミュレーションを提供するためのプログラムを開発した.現時点では完全な
CPUのエミュレーションを提供するには至っていないが,ほとんどのCPU特権命令エミュレーションを実装し終えた.
CPUエミュレーションの機能を確認するため,ゲストOSとしてDLXLinuxを立ち上げようとした.DLXLinux本体には,再コンパイル等の手
を一切加えずに起動させることを目標としたが,完全な起動には至らなかった.しかしながら大部分の部分の実装は終了しており,DLXLinuxの一部を起
動させることは可能である.図2.3.2にゲストOS (DLXLinux) のブートのスクリーンショット
(カーネルスレッドの立上りのところで,まだトラブルが残っている)報告書作成時点 (3月3日)
でのDLXLiunxの起動状況を示すスクリーンショットを示す.ゲストOS側の特権命令が,すべてVMの一般保護例外として処理され,VMが適切に命令
解析を行ない,命令のエミュレーションを行なっていることは確認済みである.
また,Ethernetによる送受信も必要最低限実装されており,VMはIEEE 802.3 Rawフォーマットのフレームを送受信できる.
図 2.3.2
ゲスト OS
(DLXLinux) のブートのスクリーンショット ( カー
ネルスレッドの立上りのところで,まだトラブルが残っている )
開発物の詳細は以下の通り.
(1) ブートストラップ部
VMを計算機内部の主記憶に適切にロードするためのプログラム.このプログラムはプログラムのロードと,その後プログラムが動作するために必要な計算機
の初期化処理などを含む.
(2) デバイスドライバ
VMが動作するために必要なデバイスドライバである.作成したデバイスドライバはPCI (ISA),FDC (Floppy Disk
Controller),ATA/ATAPI
(IDE),NE2000互換NICである.これらはすべて完全に動作し,デバッグを終了している.新たなデバイスドライバの開発や,サードパーティ製の
デバイスドライバの登場などを期待し,これらのデバイスドライバの実装は,すべてUNIXを真似た方法をとった.
(3) IEEE802.3 (Ethernet)
VMの各種割り込みデータを送受信する際に必要な通信プロトコルである.実装は完了しており,VMはIEEE802.3
Rawフォーマットを送受信できる.VMはこのIEEE802.3 Rawフォーマット上に独自のプロトコルを乗せて,通信する.
(4) VM割り込み送受信部
VMは,デバイスからの割り込みを,Ethernet上の他のホストへ,透過的に渡すことができる.この機能は,リモートデバイスを実装する上でなくて
はならない機能である.具体的には,プログラムが各種周辺機器の外部割り込みを使用する際に必ず利用する割り込みコントローラ (PIC)
i8259Aをエミュレーションするプログラムを作成することで実装した.
(5) VMページング部
各種特権命令のエミュレーションを行なう.ゲストOSに,再コンパイル等の手を加えずとも動作させることを可能とするための重要な部分である.
また,VMは自身のメモリ空間と,ゲストOSのメモリ空間を完全に独立させるため,ページング機構を利用する.図2.3.3
VMとゲストOSのメモリ空間に,物理メモリが64Mバイトであった場合のVMのページングの方法を示す.64Mバイトのうち,高位アドレスから1Mバイ
トまでの範囲が,VMの範囲である
(図の中の緑の部分).この範囲は,ゲストOSの干渉を一切許してはいけないため,VMはBIOSのプログラムを改ざんして,ゲストOS側には搭載メモリ
より1Mバイト低い63Mバイトの物理メモリを通知する.そのため一通りのBIOSのプログラムをエミュレートするプログラムも開発した.ゲストOSは
BIOSから得た物理メモリ搭載量である63Mバイトの分を,自分のメモリ領域とする.すなわち,ゲストOS側から見ると,VMのメモリは存在していない
メモリ空間となる.
図 2.3.3
VM とゲスト OS の
メモリ空間

|