PCIデバイス
バス
乗り物のバスが語源
たくさんの人が乗るバスのように、USBメモリとかマウスとかキーボードとか色々
1つのバスあたり、最大32個のPCIデバイスが接続される
PCIデバイス
1つのデバイスあたり、最大8個のファンクションを持つことが出来る
ファンクション
各デバイスが1つ以上持つ機能
ID0は必ず存在するが、それ以外は規定されていない
0しかないかもしれないし、0123があるかもしれないし、07かもしれない
IDを指定してレジスタを読み取り、ベンダーIDが0xffff(無効なID)かどうかで、ファンクションが存在するかどうかわかる
バス番号・デバイス番号・ファンクション番号をいい感じに加工して(MakeAddress)、レジスタにいい感じに書き込むと、デバイスID・ヘッダタイプ・クラスコード(base/sub/interface)・ベンダーIDなどを読み取ることが出来る
クラスコード
例えば、(base, sub, interface) == (0x0c, 0x03, 0x30) のデバイスはxHCデバイス
0x0c:シリアルバスのコントローラ
0x03:USBコントローラ
0x30:xHCI