内存到内存传输的DMA方向是什么?为何无对应方向定义?
内存到内存DMA的对应方向,以及
dma_data_direction无相关专属值的原因 首先明确:dma_data_direction枚举从设计之初就不是用来描述所有DMA场景的传输方向的,它的唯一作用是给内核DMA映射层传参,指导CPU做缓存一致性维护,适用范围仅限外设与CPU可缓存的系统主存之间的DMA传输。
枚举四个值对应的实际是不同的缓存操作逻辑,和物理传输拓扑没有强绑定:
enum dma_data_direction { DMA_BIDIRECTIONAL = 0, DMA_TO_DEVICE = 1, DMA_FROM_DEVICE = 2, DMA_NONE = 3, };
DMA_BIDIRECTIONAL:双向模式,映射时同时执行缓存刷回、缓存失效操作,CPU和外设都可能读写对应内存块,一致性开销最高DMA_TO_DEVICE:数据从内存流向设备,映射时将CPU对应位置的脏缓存行刷回主存,保证设备读到最新数据DMA_FROM_DEVICE:数据从设备流向内存,映射时将对应位置的CPU缓存行失效,保证CPU后续读操作能拿到设备写入主存的新数据,不会读到旧缓存DMA_NONE:调试用占位值,标记方向未初始化,触发非法访问报错
没有定义内存到内存、设备到设备专属方向值的原因很简单:这两类场景要么可以用现有值覆盖,要么根本不在这个枚举的适用范围内:
- 内存到内存DMA由专用DMA引擎控制器发起,传输时源内存是DMA控制器的读端,目的内存是DMA控制器的写端。做映射时,源地址按
DMA_TO_DEVICE传入(保证DMA读源内存时数据一致),目的地址按DMA_FROM_DEVICE传入(保证DMA写完后CPU读目的内存数据一致)即可,现有枚举值完全满足需求,不需要新增定义。 - 设备到设备(PCIe P2P等)DMA是两个外设直接通过总线传输数据,全程不经过CPU可缓存的系统主存,不需要CPU做缓存一致性维护,走的是独立的P2P专用DMA接口,不属于这个枚举的服务范畴,自然不需要对应值。
内容的提问来源于stack exchange,提问作者bruin
相关产品推荐
相关产品推荐

