【 MM 】聊聊 TTU 和 RMAP
开篇有必要做个名词解释,
TTU - Try To Umap
RMAP - Reverse map
选择一起聊它们两个,想必它们固然是伴有着千丝万缕的联系。
没错,当内核做出以下操作时,不得不从page的角度出发反向去找到对该page的所有映射,然后一一解除。
1、内存回收时,因为被回收的page要被写入swap或disk,后续不在原因的位置上
2、内存迁移时,通常会在compaction过程中涉及,原page要被移动到其它位置上

我们把从vma出发到物理page的映射称为正映射,从物理page反推到vma的映射称之为反映射。
下面我们正式从kernel中举例分别走一下两个映射对应的流程。
一、正映射
我们以新页面分配为例,系统中的页面通常分为anon页和file页,所以我们也要分开来看,
1、new anon page
当用户空间malloc申请页面后,kernel中由于存在写时分配优化机制,通过在申请时只会分配一个vma,只有当这段空间真正地被写入数据时,所涉及的page才会被分配出来,当未分配前访问到该page时会触发page_fault异常,而新的page就是在异常里面被分配的。
malloc申请的页面属于anon页,在异常中分配的路径通常如下(正常分配情况,不考虑swap),
static vm_fault_t __do_page_fault(struct mm_struct *mm, unsigned long addr,
unsigned int mm_flags, unsigned long vm_flags,
struct pt_regs *regs)
{
struct vm_area_struct *vma = find_vma(mm, addr);
if (unlikely(!vma))
return VM_FAULT_BADMAP;
...
}
接下来我们重点看来do_anonymous_page
好,我们重点看来do_anonymous_page
2、new file page
反映射