4.3.5 CPU 访问:vmap、mmap 与缺页处理
4.3.4 说明了设备侧如何获取页与 sg 表。本节转向 CPU 侧,对应 4.3 的需求 N3,依次讨论内核态如何读写 BO(vmap)、用户态如何将 BO 映射到自身地址空间(mmap),以及映射后发生缺页时 helper 如何将页插入页表(vm_ops.fault)。本节的主线如下:vmap为内核提供一段连续虚拟地址;mmap先将页全部换入,但仅建立页表为空的映射,待 CPU 访问触发缺页时,再由缺页回调将pages[]中的页逐个插入页表。1、vmap:内核态的连续映射内核代码有时需要直接读写 BO,例如由 CPU 填充帧缓冲。然而 4.3.4 获取的pages[]在物理上是分散的,内核需要一段连续虚拟地址。drm_gem_shmem_vmap_locked即用于此:intdrm_gem_shmem_vmap_locked(structdrm_gem_shmem_object/