在X86平台中,DMA操作是否意味着在MMIO地址空间和系统内存地址空间之间移动数据?

时间:2012-02-02 15:38:21

标签: linux-kernel dma

在现代X86 / X86_64平台上,由于MMIO机制,DMA操作是在MMIO地址空间和内存地址空间之间移动数据吗?在Linux内核中,我看到有一个dma_addr_t定义。此类型是否用于MMIO地址?

1 个答案:

答案 0 :(得分:0)

通常,DMA操作仅指CPU访问内存以外的设备。在x86上,没有单独的MMIO和RAM地址空间 - 一切都是统一的。典型DMA操作的一些示例:

  • 网卡可能会从网络接收数据包,并使用DMA将数据包内容写入系统的RAM。
  • SATA控制器可能会获得写入命令并使用DMA读取要从系统RAM发送到硬盘的数据。
  • 显卡可能会使用DMA将纹理数据从系统RAM读取到自己的视频内存中。系统CPU通过PCI BAR(MMIO)可以看到视频内存,但这并不重要。

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设备使用的所有地址。