2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BitVisorとIOMMU (VT-d)

Posted at

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

参考文献

  1. 例えばゲストにPCIデバイスを隠蔽してBitVisorが利用する場合,ゲストOSからはそのデバイスが見えていないので,ゲストOSはそのデバイスに対するIOMMUマッピングを作成しません.結果としてそのデバイスはDMAできなくなります.

  2. 手元にAMDのマシンがないので試したことはありません.

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?