DMA BUF 驱动的基本接口,非只操作DMA硬件,可以直接CPU操作
#include <linux/dma-buf.h>
#include <linux/module.h>
static const struct dma_buf_ops exp_dmabuf_ops = {
.map_dma_buf = 映射 可null, 返回管理的内存,非原子操作
.unmap_dma_buf = 解映射,
.release = 释放, 释放管理的内存
.map_atomic = 已经废弃, 返回管理的内存原子操作
.map = exporter_kmap 可null,
.mmap = exporter_mmap,
.vmap
};
static int __init exporter_init(void) {
DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
struct dma_buf *dmabuf;
exp_info.ops = &exp_dmabuf_ops;
exp_info.size = PAGE_SIZE;
exp_info.flags = O_CLOEXEC;
exp_info.priv = kzalloc(PAGE_SIZE, GFP_KERNEL); 此函数获取物理连续内存, kfree
dmabuf = dma_buf_export(&exp_info);
return 0;
//pr_info 向终端打印
}
module_init(exporter_init);
DMA 硬件接口
- sg_table DMA管理内存块的链表,node 为scatterlist
- sg_dma_address(sgl) 可以获取scatterlist的所代表的连续物理内存的地址
- sg_dma_len(sgl) 获取catterlist的所代表的连续物理内存的长度
- 使用dma_buf_attach()关联DMA与输入输出设备,生成dma_buf_attachment结构,会调用驱动的dma_buf_ops函数接口,可以不注册该接口
- dma_buf_map_attachment()从4生成的关系中获取sg_table
相关博客
- dma-buf
- DMA和一致性缓存
- mmap
- remap_pfn_range