【レポート】

IDF Spring 2006 - VT・PCI Expressの最新情報、その他ちょっと変わったもの

1 VTに追加されるI/Oの仮想化

    大原雄介  [2006/03/22]

    さてIDF最後のレポートは、色々目に付いたものや、ちょっと面白いトピックについてご紹介したい。順序としては、堅いものからやわらかいもの、最後は変わったものという順である。

    VT-d(Intel Virtualization Technology for Directed I/O)

    Gelsinger氏の基調講演の中でちょっと触れられたのが、Intel Virtualization TechnologyのI/O拡張であるVirtualization Technology for Directed I/O、通称VT-dである(Photo01)。基調講演では更にVMwareのDiane Greene氏も登場し(Photo02)、VMwareは2007年に全製品ラインナップでこのVT-dをサポートすることを明言した(Photo02,03)。

    Photo01:基調講演の中で、このSpecificationが公開されたことをアピールした。ちなみに入手はコチラから可能である。

    Photo02:今のところVMwareのVTサポートは、WorkstationとPlayerで"Experimental"という扱いでサポートされているのみだが、これが正式サポートになるという訳だ。

    Photo02:President, VMware, Inc.のDiane Greene氏。

    さてそのVT-dとは何か? 要するにCPUやメモリのみを仮想化しても、それだけでは複数のOSが同時に動くためには十分ではない(Photo04)。このためIntelはVTをどんどん進化させることを考慮している(Photo05)。

    Photo04:Virtualizationの利用例のいくつか。要するに異なるハードウェア上で動いていた環境を、VMMの上でまとめて動かすという使い方になるのが一般的で、この際にCPU以外のI/Oの仮想化も必要になるという話だ。

    Photo05:まずVT-i/VT-x(CPUのVirtualization)をサポートし、ついでチップセットレベルでのI/O仮想化(これがVT-d)を実現、将来的にはI/Oレベルでの仮想化を進めるという方向性が打ち出された。

    その仮想化にはいくつかの方法がある(Photo06)が、VT-dが対応するのは中央のやり方だ。つまりVMMの中で仮想化するという方式である。この方式の場合に必要なのは、チップセットの対応とデバイスドライバの多少の書き換えで、CPUなどには一切変更が無い。欠点はスライド中のCon:にある"Larger Hypervisor"だが、チップセットにこれをサポートする機能を入れることで、肥大化を最小におさえようという訳だ(Photo07)。この結果、PCIやPCI Expressなどに関しては、ほぼ問題なく仮想化が可能になっている(Photo08)。

    Photo06:左端は、全てのI/O要求を一旦(VMM外の)Service VMで受け、ここでルーティングするという方式。一番柔軟性は高いが、性能が犠牲になる。一方右端は、特定のGuest OSが特定のH/Wを占有する方式。もっとも高速でオーバーヘッドも少ないが、使い方が極めて制限される。中央はHyperVisorの中でデバイス毎にシェアリングを行う方法。欠点はVMMが肥大化することだ。

    Photo07:完全にHyperVisor S/Wだけでこれを実現すると、管理のためのContextがどんどん増えることになる。が、適切なH/W Assistを付加することでこれが最小になるとの主張。

    Photo08:ちなみにLegacy Deviceはどうするのか? と思ってAjay Bhatt氏を捕まえて聞いたところ、これらも完全に仮想化するとの事。ただこれらには仮想化支援を行うためのハードウェア的な機能が無いので、Service VMに近い方法でハンドリングする模様だ。ちなみにBhatt氏の現在の肩書きはIntel Fellow, Digital Enterprise Group, Director, Platform Components and Interconnects Architectureとなっている。

    さて、具体的にチップセットのサポートとは何か? という話をもう少ししたい。一番問題になるのは、DMAの転送である。適切なリソース配分メカニズムが無い場合、一度VMMでDMAリクエストを受け、そこでSerializeしてデバイスに出し、結果を再びVMMで受けて各VMに配分するのが一番楽である(Photo09)。ただこれだとあまりにVMMの負荷が高く、オーバーヘッドが大きくなる。そこで、初期化や設定はVMM経由としながらも、DMA転送は各VMから直接出せる様にする、という方式をとっている。この場合、問題になるのはDMA転送を行うメモリアドレスである。これは各VM毎に異なったアドレスとなるから、これをうまくハンドリングせねばならない。このため、VM-dではPCI ExpressのRIDを見ながらVMにあわせてアドレス変換を行う。Photo10はPCI Expressのケースだが、PCIでもこのメカニズムは同一であろう。

    Photo09:左の方式だと、しかしPhoto07のService VM方式と基本的に違いが無い。単にVMM上で動くか、別のVMになるかである。右の方式を使うと、オーバーヘッドはだいぶ軽減される。

    Photo10:この仕組みを入れるためにはPCIのControllerに手を入れる必要があり、このためにチップセットの拡張が必要になるというわけだ。

    Photo11は、システム全体を改めてまとめた構図である。複数のVMから同時にアクセスする場合に、I/Oの種類に応じて異なるルートが用意されていることがわかる。さて、次に考慮すべきことは、リクエストのハンドリングである。仮にH/W側で複数のVMからのリクエストをハンドリングできるようにすれば(Photo12)性能面では有利だが、ハードウェアとソフトウェアの開発負荷が増える。一方Service VMでキューイングする形にすると、ハードウェアやソフトウェアは現在のままいけるが、性能面でのデメリットがある。おそらく当初はPhoto13の方式がメインであり、将来的にVTが一般的になってきたら、次第にPhoto12の形をとるハードウェアが増えてくるであろう、というのが現状の見通しである。

    Photo11:Service VMはConfig Registerなどの管理のためと、先に述べたとおりLegacy Deviceのハンドリングに必要である。

    Photo12:ハードウェアが複数のリクエストをハンドリングできるようにするためには、当然ドライバの対応も必要となる。その一方VMMはリクエストをそのままスルーする形になるので、負荷は最小である。

    Photo13:Service VMでリクエストをキューイングして実行する形だと、ドライバやハードウェアはVMを意識する必要はない。

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン