在内核态要访问某用户进程地址空间,本质就是使用该用户进程地址空间的页表,可使用 use_mm 切到使用用户进程的 mm,即设置 task->mm = mm,在设置之前内核线程的 mm 是 NULL。在调用 unuse_mm 时,task->mm 又会被设置为 NULL。
例如 vhost_worker 是处理 virtio ring(vring)的线程, vring 中虚拟机所填充的 dma buffer 只有当初创建该虚拟机的 QEMU 进程的页表才能解析,QMEU 的地址空间即为 dev->mm,解析路径为:dma 地址即 IOVA -> HVA -> HPA。其中 IOVA -> HVA 由 QEMU 注册到 vhost 的 mem table 来解析,HVA -> HPA 就由 dev->mm 对应的页表来解析,