DRM驱动代码分析:gem_prime_import

struct scatterlist、struct sg_table

struct scatterlist {
   
	unsigned long	page_link;
	unsigned int	offset;
	unsigned int	length;
	dma_addr_t	dma_address;
#ifdef CONFIG_NEED_SG_DMA_LENGTH
	unsigned int	dma_length;
#endif
};
struct sg_table {
   
	struct scatterlist *sgl;	/* the list */
	unsigned int nents;		/* number of mapped entries */
	unsigned int orig_nents;	/* original size of list */
};

结构体说明查看wowotech网站的文章《Linux kernel scatterlist API介绍》

struct dma_buf、struct dma_buf_attachment、struct dma_buf_ops

struct dma_buf {
   
	size_t size;
	struct file *file;
	struct list_head attachments;
	const struct dma_buf_ops *ops;
	struct mutex lock;
	unsigned vmapping_counter;
	struct dma_buf_map vmap_ptr;
	const char *exp_name;
	const char *name;
	spinlock_t name_lock;
	struct module *owner;
	struct list_head list_node;
	void *priv;
	struct dma_resv *resv;
	wait_queue_head_t poll;
	struct dma_buf_poll_cb_t {
   
		struct dma_fence_cb cb;
		wait_queue_head_t *poll;
		__poll_t active;
	} cb_in, cb_out;
#ifdef CONFIG_DMABUF_SYSFS_STATS
	struct dma_buf_sysfs_entry {
   
		union {
   
			struct kobject kobj;
			struct work_struct sysfs_add_work;
		};
		struct dma_buf *dmabuf;
	} *sysfs_entry;
#endif
	ANDROID_KABI_RESERVE(1);
	ANDROID_KABI_RESERVE(2);
};

通过dma_buf_export创建dma buf;
通过dma_buf_fd创建文件描述符;
通过dma_buf_put()和get_dma_buf()对dma buf进行引用计数;
通过struct dma_buf_attachment访问设备DMA;



size:buffer的大小,在buffer的生命周期内保持不变。

file:文件指针,用于引用计数。

attachments:dma_buf_attachment列表,表示所有连接的设备。

ops:操作函数

vmapping_counter:vmap的计数

vmap_ptr:虚拟地址

exp_name:exporter名字

name:用户层提供的名字

owner:指向exporter模块

priv:exporter私有数据

struct dma_buf_attachment {
   
	struct dma_buf *dmabuf;
	struct device *dev;
	struct list_head node;
	struct sg_table *sgt;
	enum dma_data_direction dir;
	bool peer2peer;
	const struct dma_buf_atta
### 如何从DRM导出DMABUF 在Linux图形编程环境中,DMA-BUF框架允许不同子系统之间的缓冲区共享。通过Direct Rendering Manager (DRM),可以创建并管理这些缓冲区以便于高效的数据传输和处理。 为了实现从DRM导出DMABUF的功能,在应用程序层面通常会涉及到调用特定接口来获取文件描述符(fd)表示形式的DMA buffer对象。具体操作如下: 当需要从DRM设备导出一个现有的GEM(Graphics Execution Manager)句柄作为DMA-BUF时,可以通过`ioctl`命令向内核发送请求[^1]。这涉及到了解底层硬件抽象层(HAL)以及遵循相应的API规范。 以下是Python伪代码示例展示如何执行此过程: ```python import os from fcntl import ioctl # 假设已经获得了一个有效的DRM文件描述符 drm_fd 和 GEM handle gem_handle drm_fd = ... # DRM 文件描述符 gem_handle = ... # GEM 句柄 # 定义 IOCTL 请求码用于导出 DMA_BUF DRM_IOCTL_PRIME_HANDLE_TO_FD = 0xC0086409 class DrmPrimeHandleToFDArg: def __init__(self, handle, flags): self.handle = handle self.flags = flags self.fd = -1 arg = DrmPrimeHandleToFDArg(gem_handle, 0) result = ioctl(drm_fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, arg) if result != 0 or arg.fd < 0: raise Exception("Failed to export DMABUF") dmabuf_fd = arg.fd print(f"Exported DMABUF with FD={dmabuf_fd}") ``` 上述代码片段展示了怎样利用`ioctl()`函数配合自定义结构体参数完成一次完整的DMA-BUF导出流程。这里假设读者具备基本的C/C++或类Unix系统的开发经验,并熟悉POSIX I/O模型下的文件操作方法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值