1.需求与设计目标
在 Linux DRM 框架中,用户空间与 GPU 驱动之间的数据交换和缓冲区管理,用到内存映射(mmap)操作。首先要理解用户空间访问任何对象的唯一方式就是拿到该对象的虚拟地址。而mmap正是创造虚拟地址的一种方式,这种方式把bo看成了一个文件,使用了文件内存映射的机制。
对于mmap的功能这里给出一个解释:mmap实现了物理内存上的文件内容映射到用户态空间(VMA),用户态可直接访问的效果;本质是以page为单位将VMA与物理page进行关联的机制。用在bo的映射上,就是将bo的物理页映射到一段进程的VMA上。mmap函数的传入参数有三个关键参数:
1. 要映射的文件:是设备文件,也就是drm_device打开后对应到drm_file;
2. 映射的文件长度:文件长度通常是要访问的GEM对象的大小;
3. 映射的文件偏移。
这些参数都与bo没有关系,那该如何使用该接口呢?这就是drm_vma_offset_manager起作用的地方了,也是其设计目标。GEM 通过一套虚拟 offset 机制(fake offset)来查找bo,进而进行映射。
为了安全、高效地管理用户空间对Buffer Object的访问,DRM 提供了 VMA(Virtual Memory Area)管理机制。drm_vma_offset_manager
订阅专栏 解锁全文

302

被折叠的 条评论
为什么被折叠?



