| 規格名 | 用途 |
|---|---|
| OHCI | USB1.1 |
| UHCI | USB1.1 |
| EHCI | USB2.0 |
| xHCI(eXtensibleHostControllerInterface) | USB3.x ホストコントローラのインターフェースを定めた規格。(中には仮想ドライバもある) |
| クラス | 用途 |
|---|---|
| 標準クラス | USB規格で定められたもの |
| HIDクラス | マウスやキーボードが属する (HID:HumanInterfaceDevice) |
| オーディオクラス | オーディオ機器が属する |
| マスストレージクラス | 記憶装置が属する |
部品とマザーボードを繋ぐための規格。現代のパソコンの中心的な技術。xHCI規格ではxHCはPCIデバイスであると定められている。そのほかにも「NVMeSSD」「高精度タイマ」「ネットワークカード」「GPU」といったパソコンを構成する主要な部品がPCI、およびその後継規格「PCIe」によって接続される。現代のパソコン用OSを作るうえでは必須の技術。PCIとPCIeは互換性があるためPCIを扱えればよい。
「PCI規格に準拠した機器」が持っている256byteの空間。ここにはPCIデバイスのベンダID(制作会社ごとに割り振られたID)、クラスコード(PCIデバイスの種類を表す数値)などのPCIデバイスに関する基礎的な情報が書かれている。
| 名称 | 場所 | 説明 |
|---|---|---|
| Vendor ID | 0-15bit(1-2byte) |
|
| Device ID | 16-31bit(3-4byte) | |
| Command | 32-47bit(5-6byte) | |
| Status | 48-63bit(7-8byte) | |
| Revision ID | 64-71bit(9byte) | |
| Interface | 72-79bit(10byte) | Programming Interfaceという。レジスタレベルの仕様を表す。
APIがソフトウェア同士のインターフェースであるのに対して、ハードウェアに関するインターフェースといえる。 |
| Sub Class | 80-87bit(11byte) | Sub ClassとBase Class合わせてクラスコード
※PCI-to-PCIブリッジの場合には、「Base Address Register2」にセカンダリバスの番号が格納されている。それを参照することで、ブリッジに接続されたデバイスを検索できる |
| Base Class | 88-95bit(12byte) | |
| Cacheline Size | 96-103bit(13byte) | |
| Latency Timer | 104-111bit(14byte) | |
| Header Type | 112-119bit(15byte) | 7bit(先頭1bit)目が1でマルチファンクションデバイスを表す。0でシングルファンクションデバイス。一般的なデバイスはすべて0x00(シングルファンクションデバイス)。 |
| BIST | 120-127bit(16byte) | |
| これ以下(16byte[0x10~])はPCIデバイスのHeaderTypeにより異なる | ||
| Base Address Register 0 | 128-159bit(17-20byte) | xHCのレジスタ群が配置されているメモリアドレスが記載されている。xHCを制御するレジスタ群はMMIOとなっていて、MMIOアドレスは「Base ADdress Register 0~1」に記録されている(64bit)。 |
| Base Address Register 1 | 160-191bit(21-24byte) | |
| Base Address Register 2 | 192-223bit(25-28byte) | |
| Base Address Register 3 | 224-255bit(29-32byte) | |
| Base Address Register 4 | 256-287bit(33-36byte) | |
| Base Address Register 5 | 288-297bit(37-40byte) | |
| Cardbus CIS Pointer | 298-329bit(41-44byte) | |
| Subsystem Vendor ID | 330-345bit(45-46byte) | |
| Subsystem ID | 346-361bit(47-48byte) | |
| Expansion ROM Address | 362-393bit(49-52byte) | |
| Capabilities Pointer | 362-369bit(53byte) | |
| Reserved | 370-425bit(54-60byte) | |
| Interup Line | 426-433bit(61byte) | |
| Interrupt Pin | 434-441bit(62byte) | |
| Min_Gnt | 442-449bit(63byte) | |
| Max_lat | 450-457bit(64byte) | |
| Device dependent region | 458-1865bit(65-256byte) | |
| ビット位置 | 内容 |
|---|---|
| 31 | Enableビット。1にした状態で、CONFIG_DATAレジスタを読み書きすることで、任意のレジスタを読み書きすることができる。 |
| 30:24 | 予約領域。0にしておく |
| 23:16 | バス番号(0-255) |
| 15:11 | デバイス番号(0-31) |
| 10:8 | ファンクション番号(0-7) |
| 7:0 | レジスタオフセット(0-255)。4byte位置のオフセットを指定する |
結果として、CONFIG_ADDRESSを指定してそれに一致するデータを呼び出す。データはデバイスが持っているPCIコンフィギュレーション空間の256byteのデータである。CONFIG_DATAを参照することで、該当のデータが得られる。CONFIG_DATAへはCONFIG_ADDRESSのレジスタオフセットによって移動された箇所のデータが入る。ベンダIDであれば、オフセット0で32bitが呼び出されるため16bitをandすることで算出できる。デバイスIDであれば、オフセット0で32bitが呼び出されるため16bit右シフトすることで算出できる。(ベンダIDは0xffffで無効なベンダID)なのでベンダIDを判定することで実装されていないファンクション番号を特定できる。ファンクション0が実装されていない場合にはバスが存在しない。バス、デバイス、ファンクションの番号をそれぞれ用いて、HeaderTypeを読み込む。HeaderTypeによって16byte目以降が異なる。(一般的なHeaderTypeは0x00になっている)シングルファンクションデバイスかマルチファンクションデバイスかで、
| 名称 | 場所 | 説明 |
|---|---|---|
| 0xfee | 31:20 | |
| Destination ID | 19:12 | 割り込みを通知するCPUコアの番号(Local APIC ID)を設定する。(LocalAPIC ID:0xfee00020番地のビット31:24にある。これがプログラムで動作しているCPUコアの番号。マルチコアCPUではコアごとに固有のLocal APIC IDが割り振られている。これは割り込みをどのCPUコアに通知するかを指定するために必要。マルチコアでは電源投入時には唯一のコアしか起動していない。他のコアは明示的に起動されるまで停止している。最初に動くコアをBSP(Bootstrap Processor)という。) |
| 予約(Reserved) | 11:4 | |
| Redirection Hint | 3 | 本書では0を入力。1に設定するとDestination Modeとの組み合わせで柔軟な割り込みの配送が可能となる。 |
| Destination Mode | 2 | |
| XX | 1:0 |
| 名称 | 場所 | 説明 |
|---|---|---|
| 予約(Reserved) | 31:16 | |
| Trigger Mode | 15 | |
| Level | 14 | |
| 予約(Reserved) | 13:11 | |
| Delivery Mode | 10:8 | |
| Vector | 7:0 | 割り込みベクタ番号を設定する。イベント時にはここに設定した割り込みベクタに対して割り込み処理が発生する。 |