libdrm全解析三十九 —— 源码全解析(36)

本文详细解读了libdrm库中的munmap()函数用于取消显存映射,以及drmIoctl(DRM_IOCTL_MODE_DESTROY_DUMB)用于销毁DUMB缓冲区,展示了资源释放流程中的关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接前一篇文章:libdrm全解析三十八 —— 源码全解析(35)

本文参考以下博文:

DRM 驱动程序开发(VKMS)

特此致谢!

前一篇文章讲解完了资源的释放流程中的drmModeRmFB(),本回讲解munmap()和drmIoctl(DRM_IOCTL_MODE_DESTROY_DUMB)。

  • munmap()

先来看munmap()。它与mmap()是一对。

实例代码片段如下:

    ……
    //通过offset找到对应的显存(framebuffer)并映射到用户空间
    uint32_t *vaddr = mmap(0, create.size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, map.offset);	
    ……
    munmap(vaddr, create_size);
    ……

munmap函数的作用一目了然,取消之前通过mmap()实现的显存和用户空间的映射。

  • drmIoctl(DRM_IOCTL_MODE_DESTROY_DUMB)

drmIoctl(DRM_IOCTL_MODE_DESTROY_DUMB)与

drmIoctl(DRM_IOCTL_MODE_CREATE_DUMB)是一对。

80. DRM_IOCTL_MODE_DESTROY_DUMB

第80个宏是DRM_IOCTL_MODE_DESTROY_DUMB,相应代码如下:

#define DRM_IOCTL_MODE_DESTROY_DUMB    DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)

结合之前文章中的_IOWR(type,nr,size)的最终定义,得到如下代码:

#define DRM_IOCTL_MODE_DESTROY_DUMB        ( ((3)  << 30) | (('d') << 8) | ((0xB4)   << 0) | ((sizeof(struct drm_mode_destroy_dumb)) << 16) )

struct drm_mode_destroy_dumb在同文件(include/drm/drm.h)中定义,代码如下:

struct drm_mode_destroy_dumb {
	__u32 handle;
};

DRM_IOCTL_MODE_DESTROY_DUMB对应的Userspace API为:drmModeDestroyDumbBuffer()。该函数在xf86drmMode.c中,代码如下:

drm_public int
drmModeDestroyDumbBuffer(int fd, uint32_t handle)
{
	struct drm_mode_destroy_dumb destroy = {
		.handle = handle,
	};

	return DRM_IOCTL(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy);
}

函数的作用是将销毁一个 dumb buffer 对象。

资源释放流程中的其余函数将在后续文章中进行解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值