BitVisorはIOMMU (VT-d) を以下のように利用しています.
- VT-dの隠蔽
- IOMMUによるBitVisorの保護
- ファームウェアが有効化したVT-dの無効化
以下でこの機能について簡単に説明します.
なお,IOMMUはIntelとAMDで異なりますが,BitVisorが対応しているのはIntel(VT-d)のみです.
ソース
以下あたりに関連する箇所があります.
- core/acpi.c
- core/acpi_dsdt.c
- drivers/iommu.c
- driver/dmar.c
VT-d
Intel VT-d (Intel® Virtualization Technology for Directed I/O)[1] には以下のような機能が含まれます.
- DMA Remapping
- PCIデバイスがDMAで利用するアドレスの変換.通常IOMMUといった場合この機能を指すことが多いかも.
- Interrupt Remapping
- 割り込み番号の変換
- Posted Interrupts
- VMX non-rootのゲストにVMEXIT無しで割り込みを挿入する機能
なお,VT-dは名前から察するにもともと仮想化を意識して導入された機能のようですが,VT-dの機能は必ずしも仮想化(VT-x)と合わせて利用する必要はありません.例えば,仮想化環境でない通常のOSでもDMA RemappingやInterrupt Remappingが利用できます.
BitVisorは設定次第でDMA Remapingを利用します.
VT-d情報の取得
VT-dの情報はACPIのDMARテーブルに含まれています(ちなみに,AMDの場合はIVRSというテーブルがあります).BitVisorのブートの初期段階で呼ばれるacpi_init_global()
でACPIテーブルを解析しています.
VT-dの隠蔽
acpi_init_global()
では,ACPIテーブルのシグネチャをNULL埋めすることでDMARをゲストから隠蔽しています.(結果として,ゲストはVT-dを利用しなくなります).これは例えばゲストがIOMMUを設定してしまうと,ゲストの設定したIOMMUについて知らないBitVisorのデバイスドライバが正しく動作しなくなるためです1.
DMA RemapingによるBitVisorの保護 (VTD_TRANS
)
VTD_TRANS
というコンフィグが有効の場合(デフォルトでオフ),DMA Remappingを利用してBitVisor自身を保護するようになります(drivers/iommu.c:iommu_setup()
)[2].
もともとBitVisor自身のメモリ領域はBIOSで利用不可能領域としてゲストに通知 & EPTで保護されていますが,原理的にはデバイスはDMAによりBitVisorのメモリ領域にアクセスすることが可能です.これをDMA Remappingで防ぐのがこのオプションです.具体的には以下のようなマッピングを設定します.
- ゲストにパススルーするデバイスは,BitVisorが使用するメモリ範囲はDMA不可
- BitVisorが使用するデバイスは,BitVisorが使用するメモリ範囲の一部のみDMAを許可 (
add_remap()
で設定)
ファームウェアが有効化したVT-dの無効化 (DISABLE_VTD
)
DISABLE_VTD
というコンフィグが有効の場合(デフォルトでオン),BitVisor起動時にVT-dが有効であった場合に,それを無効化します(VT-dのstatus registerを0にする).これは,macのファームウェアは起動時にVT-dを有効化する一方で,BitVisorがDMARを隠蔽したままmacOSが起動するとクラッシュすることの対策です.macでBitVisorを利用する場合にはこのオプションを有効にする必要があります[3].
AMD IOMMUについて
最初に書いた通り,現在BitVisorにはAMD IOMMUのサポートはありません(IOMMUを特に隠蔽せず,ゲストにそのまま見せています).BitVisorのデバイスドライバが有効かつ,ゲストがAMD IOMMUを有効にするとおそらく何かしらの問題が生じると思います2.
参考文献
-
- deep_tkkn, IOMMUによるBitVisorの保護, BitVisor Advent Calendar 2017, 2017.
-
- 榮樂 英樹, BitVisor 2017年の主な変更点, BitVisor Summit 6, 2017.
- "最新ファームウェアがVT-dを有効にするようになったため無効化機能を追加 (CONFIG_DISABLE_VTD)"
- 榮樂 英樹, BitVisor 2017年の主な変更点, BitVisor Summit 6, 2017.