linux DMA

Distributed liunx DMA

Posted by nomadli on November 23, 2020

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 硬件接口

  1. sg_table DMA管理内存块的链表,node 为scatterlist
  2. sg_dma_address(sgl) 可以获取scatterlist的所代表的连续物理内存的地址
  3. sg_dma_len(sgl) 获取catterlist的所代表的连续物理内存的长度
  4. 使用dma_buf_attach()关联DMA与输入输出设备,生成dma_buf_attachment结构,会调用驱动的dma_buf_ops函数接口,可以不注册该接口
  5. dma_buf_map_attachment()从4生成的关系中获取sg_table

相关博客

  1. dma-buf
  2. DMA和一致性缓存
  3. mmap
  4. remap_pfn_range