DMA(Direct Memory Access,直接存储器访问)是一种高速的数据传输方式,允许在外部设备和存储器之间直接读写数据。数据既不通过CPU,也不需要CPU干预。整个数据传输操作在DMA控制器的控制下进行。但是这种方式存在多次访存的情况,而且还存在内存一致性问题,基于此intel提出DDIO技术,是对传统DMA技术的一个优化。DDIO允许I/O设备(如支持该技术的网卡)将数据直接写入或读取CPU的最后级缓存(LLC),而非内存。既然DDIO允许设备直接访问CPU的LLC,那么访问的过程中会涉及到pcie?带着这个疑问,我们继续探究第二个问题。
正如上篇文章所讲,PCIe作为一种高速串行计算机扩展总线标准,是连接CPU与各种I/O设备(如网卡、存储控制器等)的主要通道。在采用DDIO技术的系统中,数据传输路径如下:当一个支持DDIO的I/O设备(如网卡)接收到数据时,它可以通过PCIe总线直接将这些数据传送给CPU的最后级缓存(LLC)。这个传输过程利用了PCIe提供的高速互连能力和数据带宽,即使得数据不必先经过内存,而是直接进入CPU缓存,减少了数据在内存和CPU之间来回移动的延迟。PCIe在此过程中扮演着关键角色,提供了高速、双向、点对点的数据传输信道,使得DDIO技术得以实现高效的数据交换。因此,DDIO技术的成功实施离不开PCIe总线所提供的高性能连接基础架构。
(1)网卡启动被设备识别时,告知CPU其具有DMA功能,并要求CPU分配一段连续的内存供DMA使用
(1)DMA控制器是连接设备和内存之间的硬件组件,它负责管理DMA事务。
(1)当有数据需要传输时,设备会激活其DMA控制器,指定相关的DMA通道开始数据传输。
(2)对于写操作,设备会将数据直接写入到内存的DMA缓冲区;对于读操作,则是从内存的DMA缓冲区读取数据。
(1)在DMA传输过程中,CPU并不直接参与数据搬运过程,而是可以执行其他任务,从而显著提升了系统的整体性能。
(2)只有在DMA事务开始前(初始化DMA控制器)和结束后(处理DMA完成中断),CPU才会介入进行必要的设置和清理工作。
(1)当DMA传输完成时,DMA控制器会触发一个中断通知CPU。
(2)CPU响应中断后,会执行相应的中断服务程序(ISR),确认DMA操作已完成,并可能进一步处理传输后的数据(如将网络数据包上传至协议栈处理)。
(2)这些描述符组成一个环形队列,即队列的最后一个描述符之后紧接着是第一个描述符,形成一个循环列表
(1)当网卡接收到数据包时,其内部的DMA引擎按照预先设定好的环形队列顺序读取描述符。
(2)根据描述符中的信息,DMA控制器将网络数据直接写入到主机内存中对应MBUF分配的缓冲区内。
(3)每个描述符写满后,DMA控制器自动更新描述符状态,表示数据包已经被成功放入内存。
(1)网卡完成数据包的DMA传输后,会触发一个中断通知CPU。
(2)CPU响应中断后,通过查询描述符的状态信息得知有哪些数据包已经接收完成,并进行后续处理,如解析包头、分发到不同的处理队列或转发到其他目的地。
DPDK还支持轮询(Polling)模式以及空闲中断(IDLE IRQ)等优化手段,进一步减少不必要的中断次数,提高CPU利用率和数据处理效率
pcie的讲解请看上一篇: