dma 和 cache的一致性( 三 )


【dma 和 cache的一致性】番外篇
我们在思维上,一定要想到 的接口,只是一个前端,它具体的实现是和硬件有关系的,是和平台有关系的 。
(1) 下面的例子是 CPU 内部有 保证 cache 一致性的组件,所以 也是可以申请到 带 cache的内存的 。
(2) DMA - (DMA引擎是否支持聚集散列) -- 不需要物理内存连续 ,流式映射 。
DMA - (DMA引擎是否支持聚集散列)
:离散(不连续)
:聚合 (连续)
这个时候 DMA的内存就可以是物理不连续的了,可以将 连续的内存中的数据 搬移 到 不连续的内存 。可以将不连续的内存 搬移到 连续的内存 。
硬件上可以连续传送多个 ,不需要物理内存的连续 。
这个时候,如果要进行流式映射,要用到() , 会将 多个不连续的 内存,都从 cache 上 flush一下,或者cache 。
(3) 带 MMU 的 DMA引擎 (叫IOMMU 或者 SMMU)
只是一个前端,后端直接可以跟 buddy 要内存,也可以跟CMA要内存,也可以通过 IOMMU / SMMU 。
IOMMU 或者 SMMU 会 将不连续的物理地址,通过页表映射的方式,统一变成虚拟地址连续的地址,然后给到DMA使用 。
这些都是硬件来做的 。所以 申请到的物理内存是可以不连续的 。
具体的dma的使用,可参考一下:
/.txt
/DMA-API-HOWTO.txt
/DMA-API
/dma/.c
linux下DMA驱动测试代码