Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 在X86平台中,DMA操作是否意味着在MMIO addr空间和系统内存addr空间之间移动数据?_Linux Kernel_Dma - Fatal编程技术网

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

Linux kernel 在X86平台中,DMA操作是否意味着在MMIO addr空间和系统内存addr空间之间移动数据?,linux-kernel,dma,Linux Kernel,Dma,在现代X86/X86_64平台上,由于MMIO机制,DMA操作是否用于在MMIO地址空间和内存地址空间之间移动数据?在Linux内核中,我看到有一个dma\u addr\u t定义。这种类型用于MMIO地址吗?一般来说,DMA操作只是指CPU以外的设备访问内存。在x86上,没有单独的MMIO和RAM地址空间——所有内容都是统一的。典型DMA操作的一些示例: 网卡可以从网络接收数据包,并使用DMA将数据包内容写入系统的RAM SATA控制器可能会收到写入命令,并使用DMA从系统RAM读取要发送到

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

一般来说,DMA操作只是指CPU以外的设备访问内存。在x86上,没有单独的MMIO和RAM地址空间——所有内容都是统一的。典型DMA操作的一些示例:

  • 网卡可以从网络接收数据包,并使用DMA将数据包内容写入系统的RAM
  • SATA控制器可能会收到写入命令,并使用DMA从系统RAM读取要发送到硬盘的数据
  • 图形卡可以使用DMA将纹理数据从系统RAM读取到自己的视频内存中。系统CPU可以通过PCI条(MMIO)看到视频内存,但这与此无关
dmaduaddr\t
类型在Linux中保存一个“总线地址”。例如,PCI设备(如NIC/SATA控制器/GPU)看到内存映射到的给定部分的地址可能与CPU使用的地址不同。因此Linux具有“DMA映射”的抽象来处理这种差异

在上面的第一个示例中,网络堆栈将在RAM中分配一个缓冲区,然后将其传递给
dma_map
函数,以获得它交给NIC的总线地址。NIC将使用该地址将数据包写入内存


在较旧的x86系统中,CPU使用的物理地址与外部设备使用的总线地址之间实际上没有任何区别,
dma\u map
函数几乎都是NOP。然而,在VT-d等现代技术中,PCI设备使用的总线地址可能与CPU的物理地址完全不同,因此进行DMA映射并对外部DMA设备使用的所有地址使用
DMA地址

嗨,罗兰,谢谢你的回答。所以dma地址是总线地址,可能是MMIO地址吗?我的意思是,如果网卡有一个缓冲存储器来接收您提到的数据,并且缓冲存储器将其映射到每个MMIO机制的系统地址空间,在这种情况下,dma地址就是MMIO地址,不是吗?是的,总线地址/
dma\u addr\t
可以在MMIO空间中。网卡的例子是非常不寻常的,因为几乎所有网卡都在系统RAM中对传入的数据包进行DMA。但是你可以从另一个PCI卡上为GPGPU或其他什么东西DMA到GPU纹理内存中。谢谢,我得到了它。在IOV区域,特别是在Intel VT-d中,MMIO空间可以是DMA地址。