任何一个设备驱动想要使用DMA共享缓冲区,就必须为缓冲区的生产者或者消费者。
如果驱动A想用驱动B创建的缓冲区,那么我们称B为生成者,A为消费者。
生产者:
实现和管理缓冲区的操作函数[1];
允许其他消费者通过dma-buf接口函数共享缓冲区;
实现创建缓冲区的细节;
决定在什么存储设备上申请内存;
管理scatterlist的迁徙;
消费者:
作为一个缓冲区的消费者;
无需担心缓冲区是如何/在哪里创建的;
需要一个可以访问缓冲区scatterlist的机制,将其映射到自己的地址空间,这样可以让自己可以访问到内存的同块区域,实现共享内存。
数据结构
dma_buf是核心数据结构,可以理解为生产者对象。
struct dma_buf {
size_t size;
struct file *file;
struct list_head attachments;
const struct dma_buf_ops *ops;
/* mutex to serialize list manipulation and attach/detach */
struct mutex lock;
void *priv;
};
其中
size为缓冲区大小
file为指向共享缓冲区的文件指针
attachments为附着在缓冲区上的设备(消费者)
ops为绑定在该缓冲区的操作函数
priv为生产者的私有数据
dma_buf_attachment可以理解为是消费者对象。
struct dma_buf_attachment {
struct dma_buf *dmabuf;
struct device *dev;
struct list_head node;