在现代X86 / X86_64平台上,由于MMIO机制,DMA操作是在MMIO地址空间和内存地址空间之间移动数据吗?在Linux内核中,我看到有一个dma_addr_t
定义。此类型是否用于MMIO地址?
答案 0 :(得分:0)
通常,DMA操作仅指CPU访问内存以外的设备。在x86上,没有单独的MMIO和RAM地址空间 - 一切都是统一的。典型DMA操作的一些示例:
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设备使用的所有地址。