パソコン(PC)に内臓されているCPUとメモリ、I/Oを分割して各VMに割り当て、OSにそれらを直接制御させることで、ホストOSなしで各OSが独立して動作可能なHypervisor(VMM)を開発するプロジェクトです。
最初の目標は、ひとつのPCでふたつのOSを動作させること、次の目標は各OSを個別に再起動可能にすることでしたが、2014年1月にこれらの目標を達成し、1.0をリリースしました。
OSは、Linux、Windows、FreeBSDが動きます。
VMMはBitVisor(BSDライセンス)をベースとし、AMLインタープリタや標準ライブラリの一部の関数をNetBSDやFreeBSDから移植しています。 Guest BIOSはSeaBIOS(GPL)をベースとします。
VM1の動作中に、VM0を再起動可能にしました。
VM0, VM1でFedora 20を起動・再起動可能にしました。
VMM実行中は割り込みを無効化しておき、割り込み関連の要因でVMexitが発生したときのみ、割り込みを一つ受け取りInjectするようにしました(ベースとしたBitVisorの設計に戻しました)。
バグ修正をしました。「修正した問題」を参照してください。
以下のことを確認済です。
1. USB メモリに TinyVisor をインストール可能なこと。 2. Linux のファイルシステムに TinyVisor をインストール可能なこと。 3. vm0 のみで OS を起動可能なこと。 14. qemu 上で TinyVisor を起動可能なこと。 15. IvyBridge マシンにおいて、次の組み合わせで OS を起動可能なこと。 vm0: Debian GNU/Linux 7.0 (amd64版) vm1: FreeBSD 9.2-RELEASE (amd64版) この時、vm1のOSから以下のI/Oデバイスを使用可能なこと。 SATA: ASMedia ASM1062 NIC: Realtek RTL8111E USB: Intel 7 Series/C210 Series ChipsetのxHCI 18. IvyBridge マシンにおいて次の組み合わせで OS を起動可能なこと。 vm0: Fedora 20 (x86_64版) vm1: Debian GNU/Linux 7.0 (amd64版) この時、vm1のOSから以下のI/Oデバイスを使用可能なこと。 SATA: ASMedia ASM1062 NIC: Realtek RTL8111E USB: Intel 7 Series/C210 Series ChipsetのxHCI VGA: GeForce 8400 GS 19. IvyBridge マシンにおいて次の組み合わせで OS を起動可能なこと。 vm0: FreeBSD 9.2-RELEASE (amd64版) vm1: Fedora 20 (x86_64版) この時、vm1のOSから以下のI/Oデバイスを使用可能なこと。 SATA: ASMedia ASM1062 NIC: Realtek RTL8111E USB: Intel 7 Series/C210 Series ChipsetのxHCI VGA: GeForce 8400 GS 12. IvyBridge マシンにおいて vm1 で動作している Debian GNU/Linux 7.0 (amd64版) を再起動可能なこと。 20. IvyBridge マシンにおいて vm1 で動作している Fedora 20 (x86_64版) を再起動可能なこと。 21. IvyBridge マシンにおいて vm0 で動作している Debian GNU/Linux 7.0 (amd64版) を再起動可能なこと。 22. IvyBridge マシンにおいて vm0 で動作している FreeBSD 9.2-RELEASE (amd64版) を再起動可能なこと。 23. IvyBridge マシンにおいて vm0 で動作している Fedora 20 (x86_64版) を再起動可能なこと。 24. Debian GNU/Linux 7.0 (amd64版)でビルド可能なこと。 25. Fedora 20 (x86_64版)でビルド可能なこと。
#32827 Fedora 20でビルドするとBIOSのコンパイルがエラーになる
#32812 VM0/VM1でFedora 20を起動すると、CPU1以降を認識できない
#31925 Qemu上でTinyvisorを起動したところ、Linuxが起動しない
#32764 FreeBSDをVM0で起動すると、ログインプロンプトが画面に表示されない
#32722 VM0でFreeBSDを起動すると、ACPI tableのcheck sumエラーがでる
#32902 VM1でFedora 20を再起動すると、xHCIに接続されているデバイスが認識できない
#32901 VM1でFedora 20を再起動すると、ログイン画面が表示されない
#32660 VM0で起動したFreeBSDを再起動すると、NICで通信ができない
#32404 VM1にCPUを1個しか割り当てずにVM1でFreeBSDを起動しようとすると、NICがリンクアップしない
#31392 vm1のFreeBSDを再起動すると、AHCIの初期化に失敗する
------------------------------------------------------------------------ r127 | yuichi_xy | 2013-11-23 22:27:51 +0900 (土, 23 11月 2013) | 1 line BIOS: AHCI HBA reset を実行 ------------------------------------------------------------------------ r128 | yuichi_xy | 2013-11-24 17:28:05 +0900 (日, 24 11月 2013) | 1 line VM0のOSによるACPI RESET_REGへの書き込みフックし、VM0の仮想CPUをリセットし、guestbootコードを再度メモリにロードし、VM0のBSPにguestbootを実行させるようにした。 #31349 参照 ------------------------------------------------------------------------ r129 | yuichi_xy | 2013-11-24 22:02:25 +0900 (日, 24 11月 2013) | 1 line guestboot コードの不要なコードを削除 ------------------------------------------------------------------------ r130 | yuichi_xy | 2013-11-24 23:28:21 +0900 (日, 24 11月 2013) | 1 line VM0の起動時、ビデオモードの設定と、INT 13/AH=0Dhによる HDD DISKS のリセットを行うようにした。 #31349 参照 ------------------------------------------------------------------------ r131 | yuichi_xy | 2013-12-08 23:18:37 +0900 (日, 08 12月 2013) | 1 line r128 で、 VM1 の OS がキーボードコントローラにアクセス可能になってしまい Free BSD が起動しなくなったため、アクセス不可能に戻した。 ------------------------------------------------------------------------ r132 | yuichi_xy | 2013-12-09 21:51:54 +0900 (月, 09 12月 2013) | 6 lines OSの再起動に伴うVMリセットを強化 * VM0のリセット時にPICを初期化 * VM0のリセット時にIOAPICのRDTを全てマスク * VM0/VM1のリセット時にAPICのLVTを全てマスク * VM0/VM1のリセット時にvBSPのAPICを有効のままにする #31349 参照 ------------------------------------------------------------------------ r133 | yuichi_xy | 2013-12-15 17:33:24 +0900 (日, 15 12月 2013) | 3 lines VMM起動時、BSP以外の論理プロセッサのLocal APICも有効にした。 VMのリセット時、vBSP以外の論理プロセッサのLocal APICも有効にした。 VMのリセット時、Local APICのLVTをマスクするため、Local APICを一時的に無効化してすぐに有効化するようにした。 ------------------------------------------------------------------------ r134 | yuichi_xy | 2013-12-15 23:03:01 +0900 (日, 15 12月 2013) | 1 line VM のリセット時、PIC や I/O APIC 、Local APIC をマスクした後、最大256個の割り込みを受信して EOI を発行するようにした。 ------------------------------------------------------------------------ r135 | yuichi_xy | 2013-12-15 23:32:09 +0900 (日, 15 12月 2013) | 1 line r134 で rflags レジスタの IF ビットの位置を間違えていたため修正。 ------------------------------------------------------------------------ r136 | yuichi_xy | 2013-12-16 22:08:32 +0900 (月, 16 12月 2013) | 1 line VMM実行時は割り込みを無効化しておき、割り込みをinject可能なときに割り込みを一個だけ受け取る。 #31349 参照 ------------------------------------------------------------------------ r137 | yuichi_xy | 2013-12-16 23:45:11 +0900 (月, 16 12月 2013) | 1 line VM0 かどうかの判定に cpu_is_bsp を使っていた部分を vm_get_id に変更。 ------------------------------------------------------------------------ r138 | yuichi_xy | 2013-12-21 00:03:48 +0900 (土, 21 12月 2013) | 1 line VM の再起動時、デバイスのリセットを行った後に、割り込みの受信とEOIの発行をするようにした。 #31349 参照 ------------------------------------------------------------------------ r139 | yuichi_xy | 2013-12-21 17:17:52 +0900 (土, 21 12月 2013) | 1 line r136 で行ったVMM 実行時は割り込みを無効化する改造を、 SVM にも対応させた。 #31349, #31925 参照 ------------------------------------------------------------------------ r140 | yuichi_xy | 2013-12-23 15:04:52 +0900 (月, 23 12月 2013) | 1 line VM0の再起動時、PIT,RTCを初期化し、IO APICのGSI 1をExtINTに設定し、PICのISA IRQ0をアンマスクするようにした。 #31349 参照 ------------------------------------------------------------------------ r141 | yuichi_xy | 2013-12-23 20:17:16 +0900 (月, 23 12月 2013) | 1 line BIOS: r127 で追加した AHCI HBA reset を無効化した。 #32658 参照 ------------------------------------------------------------------------ r142 | yuichi_xy | 2013-12-24 22:05:05 +0900 (火, 24 12月 2013) | 1 line vm0.boot_int18を指定した場合、VM0の再起動時に80hのHDDのMBRをロードするようにした。 #31349 参照 ------------------------------------------------------------------------ r143 | yuichi_xy | 2013-12-28 19:20:29 +0900 (土, 28 12月 2013) | 1 line VM0 の再起動時も、Secondary Bus Resetを発行する ------------------------------------------------------------------------ r144 | yuichi_xy | 2013-12-31 22:18:54 +0900 (火, 31 12月 2013) | 1 line ACPI tableを書き換えるときにchecksumを更新していなかったので更新するようにした。 #32722 参照 ------------------------------------------------------------------------ r145 | yuichi_xy | 2014-01-01 23:17:52 +0900 (水, 01 1月 2014) | 1 line シリアルコントローラエミュレータが、TBR empty 割り込みが無効化されているにも関わらず、割り込みをinjectしていた不具合を修正。 ------------------------------------------------------------------------ r146 | yuichi_xy | 2014-01-02 12:56:42 +0900 (木, 02 1月 2014) | 1 line VM0 においても、シリアルコントローラエミュレータが割り込みを Inject 可能にした。 #32764 参照 ------------------------------------------------------------------------ r147 | yuichi_xy | 2014-01-02 13:04:41 +0900 (木, 02 1月 2014) | 1 line I/O APIC のテーブルが論理ディスティネーションモードに設定されている場合、エミュレータ契機の割り込みを Inject しないようにした。 ------------------------------------------------------------------------ r148 | yuichi_xy | 2014-01-03 12:05:41 +0900 (金, 03 1月 2014) | 1 line SVM 環境において、VMexit 時に exitintinfo を intr_info へコピーするようにした。 #31925 参照 ------------------------------------------------------------------------ r149 | yuichi_xy | 2014-01-03 18:12:31 +0900 (金, 03 1月 2014) | 1 line FACP flag を見て、ACPI RESET_REG への対応有無を確認するようにした。 ------------------------------------------------------------------------ r150 | yuichi_xy | 2014-01-04 23:46:44 +0900 (土, 04 1月 2014) | 1 line BIOS: TinyVisor 用の設定ファイル bios/tinyvisor_config を登録。bios/.config が存在しない場合、bios/tinyviso_config を bios/.config へコピーするようにした。 LC_ALL=C make SeaBIOS をビルドするようにした。 #32827 参照。 ------------------------------------------------------------------------ r151 | yuichi_xy | 2014-01-06 23:14:16 +0900 (月, 06 1月 2014) | 1 line Non-paged protect modeの場合、supoervisor-mode execution preventionを無効化した。また、DSH を使用した自分宛のプロセッサ間割り込みを送信可能にした。 #32812 参照 ------------------------------------------------------------------------ r152 | yuichi_xy | 2014-01-07 23:26:57 +0900 (火, 07 1月 2014) | 1 line ゲストソフトウェアによるCR0 の PG ビットの変更時に、CR4 の値を更新するようにした。 ------------------------------------------------------------------------ r153 | yuichi_xy | 2014-01-11 21:40:23 +0900 (土, 11 1月 2014) | 1 line 例外処理関連のデバッグメッセージを無効化 ------------------------------------------------------------------------