これは不可解なので、ここですべてをレイアウトします。どうやら、 [〜#〜] mmio [〜#〜] を介して、特定のメモリマップアドレスを使用して外部デバイスにアクセスでき、そのアドレスはそのデバイス自体に再ルーティングされます(書き込みを介して) 、コマンドパケットなど)。ただし、 ハードウェアレジスタ (たとえば、CPU/GPUレジスタ、さらにはサウンドチップなど)と、メモリマップドレジスタの両方が同じ意味で使用されているという混合説明を聞いています。それらは同じものですか?
「メモリマップドレジスタ」とは、データバイトがそのデバイス内の特定のアドレスに再ルーティングされるアドレスを指しているのではありません(例:理論上:GPUの0x500アドレスはレジスタTEXTURE_BUFFER用です)。ただし、メモリマップデバイスはRAM内の物理レジスタをマップできません。
それで、基本的に、メモリマップドレジスタと単なるハードウェアレジスタの違いは何ですか?
メモリマップドハードウェアレジスタは、RAMのようにアクセスされます。すべてのCPUには、読み取り/書き込み用の特定の命令がありますRAMこれらの同じ命令は、メモリマップドレジスタにアクセスするために使用されます。
一般に、ハードウェアレジスタはメモリマップする必要はありません。これは単に一般的な規則です。
x86は、2つの別々の命令グループを使用して読み取りと書き込みを行う2つのアドレス空間を提供します。1つ目はRAMまたはメモリ空間(すべてのMOV
命令))、2つ目はI/Oスペース(IN
およびOUT
命令を使用)。x86では、ハードウェアレジスタがどちらのスペースにも表示される場合があります。
また、実際にハードウェアレジスタに到達するには、あるレベルの間接参照を実行する必要がある場合があります。デバイスは、メモリまたはI/Oスペースの「ポート」のみを公開できます。次に、そのアドレスにレジスタ番号を書き込んでから、実際に別のアドレスに書き込みたいデータを書き込む必要があります。その後、書き込みが発生します。コモドール128の古い8563VDCはこのように機能しました。 CMOS RAMおよび一部のPCIレジスタもこのように機能します。
もちろん、CPUハードウェアレジスタはメモリマップされていません(x86や一般的なCPUにはありません)。これは、ハードウェアレジスタのもう1つの例です。
最新のCPUには「モデル固有のレジスタ」(MSR)があり、これらは独自の命令(RDMSR
、WRMSR
)を使用して読み取り/書き込みされます。他のCPUレジスタには独自の命令があります(LGDT
、MOV xx, CR2
、基本的なEAX/RAXなど)
メモリマップドI/Oとメモリマップドレジスタは同じものではなく、それほど密接に関連していません。
メモリマップドI/Oは、たとえば初期のPCで使用され、RAMアドレス空間の一部がディスプレイバッファにマップされていました(一部の製品では、通常のRAMは実際にはディスプレイバッファに使用されていましたが、ディスプレイアダプタカードにバッファがありました。)その他の場合、ディスクドライブコントローラなどのハードウェアデバイスは、制御レジスタの設定/読み取りにメモリマップドアドレスを使用します。(そして、これが事実であるかどうかはわかりませんが、最新のグラフィックカードは依然としてディスプレイメモリをグラフィックプロセッサのアドレス空間にマップしていると思います。)
「メモリマップドレジスタ」にはいくつかの意味があります。 1つは、メモリマップされた制御レジスタを備えたディスクドライブコントローラの上記の例です。もう1つのまったく異なるケースは、実際にレジスタをRAMに格納しているプロセッサです。これは、初期(50年代から70年代初頭)のプロセッサではかなり一般的でした。これは、部品数が大幅に削減され、いくつかの「巧妙な」プログラミング手法も可能になったためです。いくつかのケースでは、プロセッサは2つのモデルで利用可能でした。1つはメモリマップドレジスタを備え、もう1つは(より高速な)「ハードウェア」レジスタを備えています。
また、標準レジスタの代わりに「スタック」が使用されたバロウズの「スタック」マシンのように、レジスタとは何かがあいまいな場合もありました(IIRCでは、「 RAM内のレジスタをシャドウイング」します)。