看了一下关于RMAP的东西,感觉看的云里雾里,现在简单总结下RMAP的作用:
产生背景:
我们知道一个page可以被多个进程的多个虚拟地址映射到,但是如果需要从page找到所有映射这个page的虚拟地址需要同时访问系统当前所有进程的进程空间的VMA,从中去寻找是否有虚拟地址映射到了此页面,对于系统来说,这是一个非常繁重的工作,所以这里需要一种可以从page快速找到所有映射了此页面的VMA,这种情况下RMAP就诞生了。
产生page映射的几种情况:
1.进程缺页中断分配的物理内存并建立映射。
2. 父进程创建子进程,copy父进程的VMAs到子进程,这时候会出现多个子进程的虚拟页面会映射到同一个物理页面。
3. 子进程产生写时复制操作,新建一个page并建立映射。
RMAP的作用就是在以上三种情况下,通过新的数据结构anon_vma以及anon_vma_chain建立子进程与父进程之间的内存映射的联系,从而在需要寻找某个物理页面的映射关系的时候只需要遍历通过以上两个数据结构建立起来的联系的框架里面的VMA就可以找到对应的映射到物理页面的VMA。
下面是截自奔跑吧里面的一幅RMAP映射的关系图: