こうしたSwitchの動作を行うためには、Hubは自分の配下に置かれたDeviceが何か、を記憶していないとDownstream MessageのRoutingが出来ない事になる。特にHubが複数段のカスケード接続になると、これを上位のHubはどこにRoutingしたものか判らなくなりかねない。これを解決するために、Routingの概念を追加する必要が出てきている。
他にも幾つか問題はあるが、こうした問題を解決するために、USB 3.0ではプロトコル構造を大幅に変更した。もっともPCI Expressをそのまま持ってくる、という訳にも行かない。実はかなり初期の段階ではUSB over PCI Expressとでも言うべき構造も一応検討したらしい。ところが、
- PCI Expressを全部実装するのはコスト的に無駄が多い。最終的には民生機器とか8/16bit MCUなどもターゲットとするためには、長期的にはUSB 3.0 Device側のI/F部分のBOM(Bill of Materials:総原価)を数ドルまで落とす必要があるが、USB over PCI Expressの構造ではこれが難しい。
- プロトコルオーバーヘッドが大きすぎ、性能も上がらないしレイテンシも多くなる。
といった問題があり、早いタイミングで放棄されたという。
結果として、PCI Expressのプロトコルを参考にしつつ、全く新しいプロトコルを構築する事になったが、これが結構複雑である。Photo01はUSB 2.0におけるレイヤ構造を簡単にまとめたものだ。ま、いくらなんでもこれは簡単すぎるので、もう少し細かく示したPhoto02の方が判りやすいかもしれない。USB 2.0の場合、Function Layer/USB Device Layer/USB Bus Interface Layerという3層構造になっており、これで全てが管理される。
Photo01: Universal Serial Bus Specification 2.0のFigure 5-2より抜粋 |
Photo02: Universal Serial Bus Specification 2.0のFigure 5-9より抜粋 |
対してUSB 3.0は? というとこちら(Photo03)である。図をどこまで詳細に書くか、というレベルが若干異なるから公平に比較はできないが、レイヤ構造が4層に増えており、より多くのコンポーネントとコミュニケーションを必要としていることが判る。もっと厄介なのは、Protocol層にはEnd-to-EndとPort-to-Portの両方の要素が含まれる事だ。つまりPort-to-Portの接続の中に、Link Managementをハンドリングするプロトコルが要件として入ってくる事になる。
Photo02とPhoto03を見比べていただくと判るが、一番上位にあたるDevice DriverやApplicationが、DeviceのFunctionとPipe Bundle(これは仮想的なリンクである)と繋がっており、その下でUSB System SoftwareがDevice(正確に言えばUSB Logical Device)とやはりDefault Pipe(Default Control Pipe)でつながるという部分までは全く一緒である。ここが一緒なので、USB 1.1/2.0に対応した従来のUSBアプリケーションや、USBのClass Driver/Filter DriverなどはそのままUSB 3.0でも動作することになる。ところが共通なのはここまでで、その下は全く異なっている事がお分かりいただけよう。
ではその下はPCI Expressなのか? といえば、それも違う。PCI ExpressもUSB 3.0に似て(というか、時系列を考えればUSB 3.0がPCI Expressに似てというべきなのだろうが)、上からApplication/Transaction/DataLink/Physicalという4層構造になっており、TransactionがUSB 3.0のProtocolに、DataLinkがUSB 3.0のLinkにそれぞれ対応する形になる。
ただLink層はPCI ExpressのDataLinkに「ある程度」近い(実装のアイディアはかなり似通っているが、実際の実装はかなり異なる)が、Protocol層はUSBにかなり特化しているため、PCI ExpressのTransaction層とはかなりかけ離れたものになっている。例えばFlow Control。以前のレポートでも少し触れたが、USB 3.0ではFlow ControlはLink層のみで実装されている。一方PCI Expressは連載第112回~115回で紹介したが、FC Credits(Flow Control Credits)と呼ばれるものを使い、管理されている。
で、このFC Creditsを実際にやり取りするのはDataLink層だが、FC Creditsそのものを生成するのはTransaction層であり、そういう意味ではFlow Controlの主体はTransaction層とも言えるわけで、Link層だけでFlow Controlを実現したUSB 3.0の大きな違いの一つでもある。
ということで、次回からは各層についてもう少し細かくみて行きたいと思う。
(続く)