レガシー NIC などの 32 ビット デバイスを使用する x86_64 システムの場合: NIC と DRAM の間で DMA を実行する場合、メモリ アドレスは下位メモリ (4GB 未満) にある必要がありますか?
ところで、OS は、PCI デバイス用に予約されたメモリ アドレス空間リソース、つまり BAR に格納されているアドレスをどのように認識するのですか?
PCI 構成スペースに関するウィキペディアのエントリを参照してください。PCI BAR ビットは、メモリ アドレッシング要件を伝達するために使用され、PCI 列挙中に設定されます。
PCI デバイスが 32 ビット (32 ビット アドレスしか処理できないことを意味する) の場合、おそらく "Locatable" 値を "0" (任意の 32 ビット) に設定し、アドレスを 4GB 未満に保ちます。
デバイスが 64 ビット アドレスを処理できる場合は、"Locatable" を 2 に設定します。
同様に、構成中に、PCI デバイスは BAR を介してそのメモリ要件を伝達し、OS は最終的に BAR アドレスを設定します。
問題のウィキペディアのセクションを引用するには:
指定された BDF コンビネーション ベンダー ID レジスタへの読み取りが成功すると、BIOS または OS はそれが存在することを認識します。すべての 1 を BAR に書き込み、デバイスが要求したメモリ サイズを 0 の形式で読み戻します。アドレスは無視されます。(原文のまま)
要約
すると、デバイス ハードウェアの機能に依存します。
PCI デバイスの列挙中に、ホスト OS が PCI デバイスを検出すると、BAR ビットを使用してデバイスにメモリ アドレス位置情報を要求します。2 段階のプロセスで BAR 自体を使用して、最初にメモリ サイズの要件を確立し、次にベース アドレスを構成します。