接前一篇文章:libdrm全解析三十八 —— 源码全解析(35)
本文参考以下博文:
DRM 驱动程序开发(VKMS)
特此致谢!
前一篇文章讲解完了资源的释放流程中的drmModeRmFB(),本回讲解munmap()和drmIoctl(DRM_IOCTL_MODE_DESTROY_DUMB)。
先来看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_CREATE_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 对象。
资源释放流程中的其余函数将在后续文章中进行解析。