メモリへのデバイスのマッピングを担当する指示はありません。です。
完全な答えは広すぎるかもしれませんが、例を1つまたは2つ作ることができます。
まず最初に、どのデバイスにリッスンするかを単に伝えるだけで、デバイスを構成できることを自分自身に納得させます。ハードウェアレベルでは、これは何も比較ではありません。
一部のデバイスには固定アドレスがあります。
これらは、システムの最初の起動時に存在し、他の競合他社や後続互換性のために逐次的に複製されるレガシーデバイスです。
設定可能なデバイス。
これらのデバイスには、待機するアドレス範囲を選択するためのジャンパ/スイッチがあります。競合を回避し、ソフトウェアを適切に構成することは、ユーザーの作業でした。
Plug and playデバイス。
最も有名なPnPバスはPCIですが、ISAとMCAではPnPもあります(ISAはPnPの「並べ替え」でした)。
これらのデバイスは上記のようなものですが、ソフトウェアで構成可能であり、必要なリソース(IRQ、DMA、MMIO)は、ファームウェアとOSが競合することなく割り当てられるように列挙できます。
ここで、どのようにオプション3を達成できるのだろうか。答えは簡単です:メタアドレススペース。例えばPCIの場合
、アドレス0cf8h及び装置、デバイスconfiguration space上のレジスタを選択し、読み出しまたはそのレジスタを書き込むために使用0cfch。
コンフィギュレーションスペースのレジスタを使用してデバイスをリベースすることができます。
のは、レジスタ10Hは、デバイスが耳を傾けるアドレスを保持していると仮定しますが、この擬似コードは、88888888h
uint32_t* select = MAKE_POINTER(0xCF8);
uint32_t* data = MAKE_POINTER(0xCFC);
*select = MAKE_SELECT(0, 1, 31, 0x10); //Bus 0, Device 1, Function 31, Register 0x10
*data = 0x88888888; //Set reg 0x10 to 0x88888888
あなたが見ることができるようにデバイスをマップし、ポインタをdeferencingはメモリ位置への書き込みを生成し、 0cf8hと0cfchですが、これらの場所はハードウェアによってメインメモリにルーティングされるのではなく、Host-to-PCIブリッジコントローラに送られ、関心のあるデバイスがピックアップするPCIコンフィギュレーションスペースアクセスに変換します。以降、88888888hへのアクセスが行われると、
、これは再びメインメモリなるようにルーティングが、構成デバイスがリッスンしている(通常subtractive decodingの結果として)PCIバスにされていません。ない特別に細工されたCPU命令が存在するという意味で
。すべてが何らかの命令が実行された結果であるため、ある意味では、マップされているデバイスには「責任を負う」必要があります。この回答の残りの部分については、MMIOの仕組みを知りたいと思います。
IOアドレス空間ではx86のみですが、これで気をそらさないようにしてください。
ハードウェアは、ソフトウェアが実際にメモリがあるデバイスをマップする場合、後者が優先され、デバイスへのアクセスは行われません。
質問を明確にする必要があります。タイトルの質問の答えには、I/Oポートの読み取り/書き込み、メモリの読み取り/書き込み、なし(ハードワイヤードまたはBIOS /チップセットなどによって設定されたもの)の3つが含まれます。あなたは本当にCPUを「だます」わけではありません。 CPUとメモリ/デバイス/バス間でデータをルーティングする物理メモリアドレスのデコードがあります。一部のアドレスは固定配線されている場合もあれば、変更可能な場合もあります。 –