PCIバス/デバイス/関数の列挙について混乱しています。 Wikipediaのページで PCI configuration を見ると、特定のバスについて、マスターが関数0を使用してすべてのデバイスのベンダーIDとデバイスIDを要求することがわかります。すべての0xFFが返された場合、デバイスはありませんそこで、列挙が進みます。有効なデバイスIDとベンダーIDが見つかった場合は、そこにPCIユニットがあり、それが列挙されます。 bus.device.function内のデバイスがどのように決定されるのかわかりません。
たとえば、1つのPCIバスと1つのPCI周辺機器が接続されたCPUがあるとします。 CPUがバス0(デフォルト)を調べ、すべてのデバイス番号をチェックして機能0を調べることを理解しています。周辺機器のデバイス番号はどのように決定されますか?
元のPCIフレームワーク(「従来のPCI」)およびPCI-Xでも、デバイスは「スロット」に対応し、それぞれに同じパラレルバスに接続された独自のコネクタが付いていました。各スロットには、列挙中にアサートされる一意のIDピンがありました。列挙は本質的に(スロットごとに)「このスロットには何かありますか?」デバイスは、この信号に応答してデータをバスに駆動することによって応答しました。応答がないことは、デバイスがないことを意味しました。
デバイスは「ブリッジ」でもあり、従属バスを形成していました。そのバスには個別のID(アップストリームから割り当てられた)があり、独立して列挙された独自のスロットのセットがあります。
PCI-Express(PCIe)はまったく異なります。 PCIeは実際にはバスではありません-デバイス間で共有されるリソースのように。代わりに、各デバイスは、その上流デバイス(および任意の下流デバイス)への独自の個別のポイントツーポイントシリアル接続を持っています-下流デバイスがある場合、それはブリッジとしても機能していることを意味します)。 PCIeをLANのように考えてください。各ブリッジは、他のデバイスに接続された多数のポートを持つスイッチに似ています。他のデバイスは端末デバイスである場合もあれば、他のスイッチ(PCIeブリッジなど)である場合もあります。
PCIeは、その概念的なフレームワークとアドレス指定(したがってソフトウェアに提供される動作)がPCIおよびPCI-Xと互換性があるように設計されました。ただし、実装は完全に異なります。たとえば、デバイスを列挙する場合、ポイントツーポイントであるため、列挙の各ポイントで決定する必要がある唯一の質問は「何かありますか?」各デバイスには独自の独立したワイヤセットがあるため、デバイスIDは基本的にすべてハードコードされています(したがって、トップレベルの「ルートコンプレックス」を含む各ブリッジ、tells各デバイスのデバイスIDはあります)。
すべての場合において、バス/デバイス/機能の「機能」部分は、ペリフェラル内で厳密に処理されます。たとえば、デュアルポートNICコントローラは、多くの場合、各ポートに1つずつ、2つの機能を備えています。それらは個別に構成および操作できますが、CPUから機能までのデータパスはどちらも同じです。