0

最新のX86/X86_64プラットフォームでは、MMIOメカニズムにより、DMA操作はMMIOアドレス空間とメモリアドレス空間の間でデータを移動しますか?dma_addr_tLinuxカーネルには、定義があることがわかります。このタイプはMMIOアドレスに使用されますか?

4

1 に答える 1

0

一般に、DMA操作は、メモリにアクセスするCPU以外のデバイスを指します。x86では、MMIOとRAMの個別のアドレス空間はありません。すべてが統合されています。典型的なDMA操作のいくつかの例:

  • ネットワークカードは、ネットワークからパケットを受信し、DMAを使用してパケットの内容をシステムのRAMに書き込む場合があります。
  • SATAコントローラーは書き込みコマンドを取得し、DMAを使用してデータを読み取り、システムRAMからハードディスクに送信する場合があります。
  • グラフィックカードは、DMAを使用して、システムRAMから独自のビデオメモリにテクスチャデータを読み取る場合があります。ビデオメモリは、PCI BAR(MMIO)を介してシステムCPUに表示されますが、ここでは実際には関係ありません。

このdma_addr_tタイプは、Linuxでは「バスアドレス」を保持します。たとえば、PCIデバイス(NIC /SATAコントローラー/GPUなど)がマップされたメモリの特定の部分を認識するアドレスは、CPUが使用するアドレスとは異なる場合があります。したがって、Linuxには、この違いを処理するための「DMAマッピング」の抽象化があります。

上記の最初の例では、ネットワークスタックはRAMにバッファを割り当て、それをdma_map関数に渡して、NICに渡すバスアドレスを取得します。NICはそのアドレスを使用して、パケットをメモリに書き込みます。

古いx86システムでは、CPUが使用する物理アドレスと外部デバイスが使用するバスアドレスの間に実際には違いはなく、dma_map機能はほとんどNOPでした。ただし、VT-dなどの最新テクノロジでは、PCIデバイスが使用するバスアドレスがCPUの物理アドレスとは完全に異なる場合があるため、DMAマッピングを実行し、dma_addr_t外部DMAで使用されるすべてのアドレスにを使用することが重要です。デバイス。

于 2012-02-03T19:38:58.120 に答える