質問: pcibarメモリアドレス 簡単な質問ですが、pciに関するosdev wikiページを読んでいて、次のように書かれています- ベースアドレスレジスタ(またはbar)は、デバイスが使用するメモリアドレス、またはポートアドレスのオフセットを保持するために使用できます。通常、メモリアドレスbarは物理ramに配置する必要がありますが、i/oスペースbarは任意のメモリアドレス(物理メモリを超えても)に配置できます。 memory address bars need to be located in physical ramと書かれているところがわかりません。 mmioの要点は、物理ramではなくデバイスにルーティングされるようにメモリアドレスが割り当てられることです。物理ramに配置する必要があるとはどういう意味ですか?物理的なramがインストールされている量に関係なく、3gbから4gbのアドレス空間の間のアドレスだけではないでしょうか?これはosdevサイトのエラーですか、それとも誤解していますか?リンク- ベースアドレスレジスタの見出しの下の約半分
回答: i/oデバイスと非i/oデバイスには違いがあるため、ここでは多少の混乱があると思います。 ウィキペディアから メモリマップドi/o(mmio) : メモリマップドi/oは、同じアドレスバスを使用して、メモリとi/oデバイスの両方をアドレス指定します。i/ oデバイスのメモリとレジスタは、アドレス値にマップ(関連付け)されます。したがって、アドレスがcpuによってアクセスされるとき、それは物理ramの一部を参照する場合がありますが、i/oデバイスのメモリを参照する場合もあります。したがって、メモリへのアクセスに使用されるcpu命令は、デバイスへのアクセスにも使用できます。 各i/oデバイスはcpuのアドレスバスを監視し、そのデバイスに割り当てられたアドレスのcpuアクセスに応答します、データバスを目的のデバイスのハードウェアレジスタに接続します。 i/oデバイスに対応するには、cpuが使用するアドレスの領域をi/o用に予約し、通常の物理メモリで使用できないようにする必要があります。 あなたの記事から: ベースアドレスレジスタ(またはbar)は、デバイスが使用するメモリアドレス、またはポートアドレスのオフセットを保持するために使用できます。通常、メモリアドレスbarは物理ramに配置する必要があります i/oスペースbarは任意のメモリアドレス(物理メモリを超えても)に配置できます。 メモリスペースbarレイアウトのタイプフィールドは、ベースレジスタのサイズとメモリ内のどこにマップできるかを指定します。値が0x00の場合、ベースレジスタは32ビット幅であり、2ビットメモリ空間の任意の場所にマップにすることができます。値0x02は、ベースレジスタが64ビット幅であり、64ビットメモリ空間の任意の場所にマップ(64ビットベースアドレスレジスタは使用可能なベースアドレスレジスタを2つ消費する)であることを意味します。 したがって、すべてデバイスに依存するため、2つの間に競合はありません。デバイスがバス上のメモリ参照をインターセプトする場合、アドレスは仮想です。そうでない場合は、デバイスとの通信に使用される実際の物理アドレス(nvramなど)です。ただし、すべての場合において、i/oデバイスには実際の物理アドレスが使用されます。これは、それを参照するコンピューター命令は実際のアドレスしか使用できないためです。デバイスがメモリへの参照を傍受すると、このメモリが無駄になる可能性があります。このような無駄を避けるために、オペレーティングシステムは通常、実際の物理メモリを超えて割り当てます(これにより、デバイスがすべての参照をインターセプトするため、メモリアクセス不良のエラーは発生しません)。これが、32ビットwindowsコンピュータが4gbのメモリ全体を使用できないように見えるというよく知られた問題の理由です。その理由は、32ビットのwindowsが実際のアドレスを使用してデバイスメモリを割り当てたため、アドレス指定されたメモリが実際に使用されたか、デバイスによって傍受されたために使用されなかったかの両方の場合に使用できなくなったためです。もう1つの便利なウィキペディアの記事は次のとおりです。 pci構成スペース 。