PCI/PCIeバスのメモリアドレスとI/Oアドレスの違いを誰かに教えてもらえますか?
I/Oアドレスが32ビットで、0〜4 GBの範囲に制限されており、システムメモリ(RAM)にマップされないこと、およびメモリアドレスが32ビットまたは64ビットであることを理解しています。
メモリアドレス指定は使用可能なRAMにマップする必要があるという印象を受けますが、これは本当ですか? PCIデバイスがデータをメモリアドレスに転送する場合、そのアドレスは仮想メモリではなく実際のシステムRAM(およびPCI構成中に割り当てられる)に存在する必要があります。
したがって、PCIデバイスが一度に少量のデータを転送するだけでよく、それをRAMまたはDMAを使用することに利点がない場合、I/Oアドレッシングは問題ありません(例: PCIカードに実装されたパラレルポート)。
また、PCI/PCIe I/Oアドレス指定が非推奨になり、メモリアドレス指定が優先されることを読み続けるのはなぜですか?
ありがとう!
物理アドレス空間は、64ビットアドレス指定のために最近巨大です。多くのデバイス、たとえばAHCI準拠のディスクコントローラーでは、デバイスレジスタにマップするために非常に大きなアドレス空間のチャンクが必要です。
また、IOアドレス空間は、通常のアセンブラ命令ではアクセスできません。IOポートとの間で読み取りおよび書き込みができる、特別な命令でのみアクセスできます。多くの場合、これはあまり便利で非効率的ではありません。
たとえば、上記のACPI準拠のコントローラーには、他のコアがその間に同じレジスタにアクセスして変更できない場合に、プロセッサがロックされた読み取り-変更-書き込み操作を実行してデバイスレジスタの1ビットを変更する必要がある機能があります。 IOアドレス空間では、これはまったく不可能です。
考慮すべきもう1つのポイントは、PCIバスがx86アーキテクチャに固有のものではないということです。特別なIOバスがまったくないアーキテクチャは他にもあります。したがって、デバイスベンダーは、ほとんどのシステムとの互換性を維持するためにIOアドレスを使用しないことを好みます。したがって、誰もIOアドレス空間を使用していません。それなら、すでに長い間事実上のものをデジュリさせてみませんか?