DMA映射
来源:互联网 发布:mac 解压缩rar 编辑:程序博客网 时间:2024/05/22 03:22
由于cpu cache的影响,设备在进行DMA操作时存在数据一致性的问题,kernel实现了一系列 api来解决dma一致性问题:
include/linux/dma-mapping.h
dma_alloc_coherent/dma_free_coherent:一致性DMA缓冲区申请和释放
dma_map_single/dma_unmap_single:流式DMA映射
dma_map_sg/dma_unmap_sg:聚集/分散式DMA映射
从代码来看,这几个接口都是调用了dma_map_ops中对应的hook函数。dma_map_ops中的函数又是从哪来的呢?
我们知道,SoC上具有DMA功能的设备一般是外设的host,对于驱动来说就是platform_device,顺着of_platform_populate函数,可以找到arch_setup_dma_ops:
可见这里的主角是swiotlb_dma_ops:
__dma_alloc申请page_size倍数大小的连续物理内存,并将页表属性设置为MT_NORMAL_NC,通过禁用cache来保证一致性。
__swiotlb_map_page首先判断缓冲区是否在设备dma支持的地址范围之内,如果不是做一次回弹bounce,然后对cache做clean或invalid操作来同步cache与缓冲区的数据,保证数据一致性
__swiotlb_map_sg_attrs同上。
dma_alloc_coherent申请的是page_size倍数大小的内存,如果需要的dma缓冲区比较小,岂不是会造成浪费?kernel还有dma pool:
dma_pool_create/dma_pool_destroy:创建和销毁dma pool
dma_pool_alloc/dma_pool_free:从dma pool申请释放缓冲区
dma pool是通过将dma_alloc_coherent申请的大块的一致性映射缓冲区切分成小块来满足小块一致性dma缓冲区分配的需求,具体实现参考代码。
include/linux/dma-mapping.h
dma_alloc_coherent/dma_free_coherent:一致性DMA缓冲区申请和释放
dma_map_single/dma_unmap_single:流式DMA映射
dma_map_sg/dma_unmap_sg:聚集/分散式DMA映射
从代码来看,这几个接口都是调用了dma_map_ops中对应的hook函数。dma_map_ops中的函数又是从哪来的呢?
我们知道,SoC上具有DMA功能的设备一般是外设的host,对于驱动来说就是platform_device,顺着of_platform_populate函数,可以找到arch_setup_dma_ops:
可见这里的主角是swiotlb_dma_ops:
__dma_alloc申请page_size倍数大小的连续物理内存,并将页表属性设置为MT_NORMAL_NC,通过禁用cache来保证一致性。
__swiotlb_map_page首先判断缓冲区是否在设备dma支持的地址范围之内,如果不是做一次回弹bounce,然后对cache做clean或invalid操作来同步cache与缓冲区的数据,保证数据一致性
__swiotlb_map_sg_attrs同上。
dma_alloc_coherent申请的是page_size倍数大小的内存,如果需要的dma缓冲区比较小,岂不是会造成浪费?kernel还有dma pool:
dma_pool_create/dma_pool_destroy:创建和销毁dma pool
dma_pool_alloc/dma_pool_free:从dma pool申请释放缓冲区
dma pool是通过将dma_alloc_coherent申请的大块的一致性映射缓冲区切分成小块来满足小块一致性dma缓冲区分配的需求,具体实现参考代码。
阅读全文
0 0
- DMA映射
- DMA映射
- DMA映射
- DMA映射
- 内存映射与DMA
- 内存映射和DMA
- 内存映射和DMA
- DMA映射 dma_addr_t
- linux dma映射讲解
- DMA及其映射
- mips一致性DMA映射、流式DMA映射的使用
- mips一致性DMA映射、流式DMA映射的使用
- 15 内存映射和DMA
- DMA描述符及映射
- 通用设备的动态DMA映射
- 通用设备的动态DMA映射
- DMA描述符及映射
- 内存映射MMAP和DMA
- fabric源码解析10——文档翻译之Architecture
- HDU6073-拓扑排序&搜索-Matching In Multiplication
- 【大规模图像检索的利器】Deep哈希算法介绍
- 广义线性模型(Generalized Linear Model)
- 2017.08.06【NOIP 普及组】模拟赛C组题解
- DMA映射
- HDU
- Kafka的消费编程模型
- Unable to connect to any of the specified MySQL hosts.
- Codeforces 835F Round #427 Div2F :树形DP
- 利用卷积神经网络(CNN)提取图片特征
- 数组应用,排列顺序,折半查找
- textarea和span怎么显示在一行
- Sizeof与Strlen的区别与联系