そんなわけで、USB 3.0のみならずUSB 2.0においても使い勝手が向上したxHCIであるが、(全部紹介すると、これまた大変なことになりそうなので)そのさわりだけをご紹介したい。
xHCIのSpecificationによれば、xHCI開発の動機は3つあるという。ちょっとxHCI Specificaition for USB Revision 1.0の2.1 "Motivation"の部分を簡単に訳してみたい。
1:Speed
「携帯デバイスのストレージ容量はムーアの法則に従って増え続けている。なのでベンダーは、増加を続ける容量にリーズナブルな所要時間でコンテンツなどをロードすべく、より高速なインタフェースを必要としている。USB 3.0がこれに対応するものであり、xHCIはこのUSB 3.0に対応するものである」。まぁこれに説明は要らないだろう。
2:Power Efficiency
「USBが最初に開発された時のターゲットは、高パフォーマンスのDesktop向けPCがメインだった。つまりHost Controllerの消費電力はそれほど重要なポイントではなかった。ところがMobile向けプラットフォームが重要になりつつある状況では、特にアイドル時の消費電力を下げる事が重要なポイントとなる。xHCIはHost側のMemoryを利用してのスケジューリング管理を廃し、更にUSB3の省電力管理メカニズムをサポートする。これにより、パフォーマンスを犠牲にすることなく、消費電力を下げられるようにしている」。
実のところ、USB 1.1が最初に開発された当時は、まだUSBコントローラに複雑なマイクロコントローラを搭載できるほどには半導体技術が進歩していなかった。またOHCIにしてもUHCIにしても、「2ポートあれば十分」という見積もりだったから、この程度ならば管理はHost側でやってもさして負荷ではないし、むしろ性能が上がると見られていた。当時はまさかUSBポートが14とかになるとは思わなかったろうし(仮にそうした用途があれば、USB Hubを使えばいいと考えられていた)、ところがUSBの性能を確保するために、1個のHost+Hubではなく、Hostを複数搭載するなんて形で実装が進むとは想像していなかったようだ。結果として、(使う使わないに関わらず)UHCIやOHCIのコントローラが6つとか7つも入る、という無駄な構成になってしまった。流石にEHCIはもう少し多くのポートを管理できるようになったが、それでも昨今ではEHCIが2つ搭載される、なんてケースも珍しくない。こうした無駄を省くのもxHCIの重要なポイントという訳だ。
3:Virtualization
「Virtualizationがシステムアーキテクチャの中で重要な役割を果たす割合は高くなってきているが、こうしたVirtualizationの環境下において従来のUSB Controllerはその欠点があらわになりつつある。旧来のUSB Controllerのインタフェースでは、特にDriverソフトウェアから見てクリティカルなリクエスト(Bandwidth AllocationとかAddress assignmentなど)に対して有効な解が提供できない。様々なI/O Virtualizationの手法や、あるいはI/OレジスタのReplicationなどを使う場合においても、従来のUSB Host Controllerは複数のVM(Virtual Machine)間での管理に必要なリソースを持ち合わせていないため、非常に困難が生じる。xHCIはこうしたクリティカルなリソースの管理をハードウェア側で行えるように設計されている。xHCIのVirtualizationは、
1) 個別のUSB Deviceを(バストポロジとは無関係に)直接アクセス可能
2) 動作中のVM間コミュニケーションを最小化
3) USB DeviceのNative Shareingをサポート
といった特徴も持ち合わせる」。
実のところ旧来のUSB Deviceを扱う場合、VM自身で管理するのは(特に複数VMが動作する場合には)不可能なため、通常はSupervisorがこれをハンドリングするのが常だった。つまりSupervisorがVirtual USB Controller H/WをVMの数だけ作成、各VMはこのVirtual USB Controller H/Wに対してリクエストを出し、これを受けてSupervisorが改めて実際のUSB Controllerにリクエストを出し、その結果を再びSupervisorで受け取り、そこから各VMに分配するという形である。このやり方は確実ではあるが、なにしろ事実上のSoftware I/Oだから性能が出ないのは明白である。こうした問題を解決するために、xHCI自身がある程度Virtualizationに対応した構成を取ることで、Supervisorの負荷を最小限に減らしたというわけだ。