x86/x86-64(ほとんどの他の最新のアーキテクチャではそれをサポートしていない)でのポートマップI/Oは、完全に別のアドレス空間で行われます。このアドレス空間はメモリマッピングの対象ではないため、仮想ポートアドレスは存在せず、物理ポートアドレスは存在しません。特別なin
およびout
命令を使用してポートI/Oを実行する必要があります。単純なメモリアクセス(たとえばmov
)はこの別のアドレス空間にアクセスできません。特権レベルに基づくアクセス保護が可能です。ほとんどの最新のOSは、デフォルトでユーザ空間プロセスがI/Oポートにアクセスするのを防ぎます。
たとえば、インテルの「インテル®64およびIA-32アーキテクチャー開発者用マニュアル:第1巻」(chapter 18 as of this writing)の「入出力」の章を調べることができます。
x86の初期段階では、ISAアドインカードを含む各デバイスでポートアドレスが固定されていたことに注意してください。あなたが運が良ければ、カードはデバイス間の範囲の衝突を避けるために、デバイスの可能なポート範囲の限定されたセットの1つを選択するために、jumpersのセットを持っていました。その後、Plug & Playが導入され、システムの起動時に選択を動的に行いました。 PCIはこれをさらに洗練し、I/Oバーは、オペレーティングシステムやファームウェアによって0x0000-0xffffアドレス空間内のどこにでもマッピングすることができます。多くの固有の制限のために、新しいハードウェアを設計する際には、ポートマップI/Oが強く推奨されていません。
x86のように見えますが、メモリマップされた周辺機器ではありません。この特定の質問は、理解するのに役立つものではありません。あなたは全体像を得る必要があります。 PCアーキテクチャに関する良い本が良い読書になるでしょう。そして、あなたは何について尋ねますか?仮想メモリ/メモリマッピング**または** devicceドライバ?彼らは2つの非常に異なるアプローチです! – Olaf
@Olaf周辺機器のように見えないのは、アドレス「0x16D34」ですか?それは私が与えたほんの数例であり、何も指摘していません。 – Steve
IOポートはメモリアドレスではないため、物理ポートか仮想ポートかを尋ねることはできません。 – harold