1、什么是direct memory?
Direct Memory时,物理地址和虚拟地址也不是完全相同的。Direct Memory Access(DMA)是一种特殊的I/O操作,可以允许设备直接访问系统内存而不需要CPU的干预。
在DMA操作中,设备直接访问系统内存,因此需要知道系统内存的物理地址。设备可以通过总线地址(Bus Address)来访问内存,总线地址需要转换为物理地址才能访问实际的内存。这个地址转换过程通常是由DMA控制器完成的。
而虚拟地址是由操作系统提供给进程使用的,不同的进程之间虚拟地址是可以重叠的。虚拟地址需要通过地址映射机制转换为物理地址,因此在使用Direct Memory时,需要通过内核提供的接口获取虚拟地址对应的物理地址,然后将物理地址提供给设备使用。
因此,在使用Direct Memory时,物理地址和虚拟地址是不同的。设备使用物理地址来访问内存,而进程使用虚拟地址来访问内存。需要通过特殊的接口将虚拟地址转换为物理地址,以便设备可以访问内存。
当使用 Direct Memory Access (DMA)技术时,可以直接将数据从主机内存复制到网卡的内存中,而不需要通过内核套接字缓冲区。DMA 是一种高速数据传输技术,允许设备直接访问主机内存,而不需要 CPU 的干预。
当使用 DMA 时,可以将数据从应用程序的缓冲区复制到网卡的接收缓冲区中,而无需通过内核套接字缓冲区。这种方法通常称为“zero-copy”,因为它允许数据在不涉及 CPU 的情况下从应用程序直接传输到网卡。在这种情况下,网卡可以通过总线地址(也称物理地址)直接访问主机内存中的数据,而不需要进行虚拟地址到物理地址的转换。
使用 DMA 技术可以提高数据传输的效率,因为它允许设备直接访问主机内存中的数据,而无需涉及 CPU 和内核。但是,在使用 DMA 时需要注意数据的安全性和完整性,因为它可能会涉及到不同的内存空间和不同的设备之间的数据传输。
在普通模式下发送数据:
用户空间(应用程序中)->写入数据到虚拟地址 -> 页表—>寻址找到物理地址->kernel socket缓冲区->网卡驱动程序读取