PCI デバイスが同じアドレス空間を共有するのはなぜですか?

PCI デバイスが同じアドレス空間を共有するのはなぜですか?

コンピュータが起動すると、BIOS またはオペレーティング システムは各 PCI デバイスを調べて、必要なアドレス空間の大きさを問い合わせます。次に、適切な空間を割り当て、各 PCI デバイスに空間の開始位置を通知します。これにより、PCI デバイスはその範囲内で読み取りおよび書き込み要求に応答できます。

私の疑問は、なぜすべてのデバイスに同じアドレス空間からブロックを割り当てる必要があるのか​​ということです。各デバイスに独自のアドレス空間を与えないのはなぜでしょうか?

プリント基板には、PCI デバイスを区別するための「帯域外」の方法である IDSEL ラインがすでに存在します。 これは、各デバイスにスペースが割り当てられる前の PCI 列挙中に使用されるものです。 では、列挙後のアクセスにもこれを使用せず、PCI デバイスのデコード ロジックの一部を節約するのはどうでしょうか。そうすると、速度が遅くなるなどといったことがあったでしょうか。

答え1

原則として、彼らは必要同じアドレス空間を共有します。デバイスのアドレス空間を分離することがまさに IOMMU の目的であり、次のようなさまざまな理由で役立ちます。

  • ネイティブ ドライバーを使用して、仮想マシンが物理ハードウェアに安全に直接アクセスできるようにします。
  • デバイスのアドレス指定機能を物理アドレス空間から切り離します。言い換えると、最初の 4G を超えても、物理メモリ内のどこにでも 32 ビット アドレス指定データにアクセスできるデバイスを作成できるようになります。
  • これにより、デバイス同士をより徹底的に分離できるようになり、システムのセキュリティが大幅に向上します。

なぜこれがデフォルトの動作ではないのか、また IDSEL ラインがこれに使用されないのかについては、PCI 設計の歴史についてあまり詳しくないので、正確にはわかりません。私の最初の推測は、もともと ISA カードのドライバーを PCI に移植しやすくするためだったのではないかということです (ISA はフラットな共有アドレス空間を想定しています)。また、IOMMU は設計が最も簡単なハードウェアというわけではなく、x86 プラットフォームで広く利用できるようになったのはごく最近のことです (まだ保証されていません。多くの Intel チップにはまだ IOMMU が搭載されておらず、多くのローエンド AMD チップにも搭載されていません)。

ただし、PCI Express では、デバイス間でアドレス空間を共有することに実際に利点があることを指摘しておく価値があるかもしれません。つまり、デバイス間の転送が可能になることです (ほとんどのプラットフォームではこれを適切にサポートしていませんが)。これは、RDMA を使用する大規模なグリッド設定で非常に役立ちます (転送が設定されると、リモート システムの OS が仲介する必要なく、リモート デバイスから直接データを取得できます)。

答え2

x86 システムの場合、CPU 自体は、通常のメモリ アドレス空間と IO アドレス空間の 2 つのアドレス空間にしかアクセスできません。他のシステムでは、アドレス空間が 1 つしかない場合があります (ARM、powerpc など)。これらの 2 つのアドレス空間は、PCI デバイスの観点からは分離されています。各アドレス空間にアクセスするには、異なるコマンドが使用され、ブリッジには各アドレス空間ごとに個別の構成レジスタがあります。ただし、CPU はこれらの 2 つのアドレス空間にしかアクセスできないため、接続されているすべてのデバイスをこれらの 2 つのアドレス空間にマップする必要があります。したがって、これは PCI の制限というよりも、システムの残りの部分のアーキテクチャの制限です。

また、PCI が開発された当時は IOMMU というものは存在せず、これは比較的最近追加されたものであることにも言及しておく必要があります。

関連情報