内存管理(29)RMAP反向映射2说到了父子进程他们之间的纽带建立。那这样的纽带是如何被应用的呢?
在内核中主要应用在:
1.kswap内核线程回收页面时需要断开所有映射了该匿名页面的用户PTE页表项;
2.页面迁移时,需要断开所有映射到匿名页面的用户PTE页表项。
1.预备知识点
从内存管理(28)RMAP反向映射1中匿名页缺页中断,当缺页中断发生时系统会创建一个avc和av,并将page->mapping指向av,avc的av成员指针指向刚刚创建的av,avc的vma成员指向(父/子)进程地址空间vma,最后avc被分别添加到av的红黑树,(父/子进程)vma下的链表进行管理。关系如下图所示。最终的效果就是通过avc可以找到与page建立映射关系的所有进程的vma。
![36eb6f101e8dc7bbfeabbf48c0d84fdd.png](https://img-blog.csdnimg.cn/img_convert/36eb6f101e8dc7bbfeabbf48c0d84fdd.png)
avc、vma、av关系
2.应用
try_to_unmap()函数:断开page对应的所有vma
![ea29d2668b289526b09bc4b7606079a5.png](https://img-blog.csdnimg.cn/img_convert/ea29d2668b289526b09bc4b7606079a5.png)
try_to_unmap()函数
![c75ef1916bbb92ef75e6b4eaf0d7a755.png](https://img-blog.csdnimg.cn/img_convert/c75ef1916bbb92ef75e6b4eaf0d7a755.png)
rmap_walk函数
![50cf8821af1bb14a83ae2bb7dddf19b0.png](https://img-blog.csdnimg.cn/img_convert/50cf8821af1bb14a83ae2bb7dddf19b0.png)
rmap_walk_anon函数
- 258~270行:这部分是断开page上所有VMA反向映射的关键。遍历anon_vma下的avc树,找到其下所有的avc对应的vma,调用rmap_one()函数依次断开并清除对应的PTE表项,最后看下是否断开成功条件,成功就跳出循环返回结果。