反向映射和写时复制

4.0的内核后,反向映射以vma为单位,且avc不在链入父辈进程

那么,在子进程发生写时复制,重新分配内存页后,为什么不将其从父进程的vma的avc中删除此子进程呢?

wowotech上有个回答很不错, 如下:

http://www.wowotech.net/memory_management/reverse_mapping.html

========================================================

 anon rmap确实存在这个问题,比如进程A fork了进程B,进程B,fork了进程C..如果一个pageA属于进程A且映射到相应的vma,那么在对这个page进行逆向映射时,确实会扫描到3个vma。如果进程C触发写保护异常,分配了一个新页pageC,那么在做pageA的逆向映射时,仍然会扫描到3个vma。我猜测linux这么实现的原因可能是:一个vma可能映射对个page,即使子进程对一个页面触发了写保护异常,但是其它page的映射关系没有发生改变。为了避免逆向映射时找到错误的vma,所以Linux做了以下工作: 
1.在page_referenced_one中通过page_check_address函数进行校验 
2.通过mapcount来优化逆向映射的过程,一旦映射到page的pte数量等于了mapcount,就不再继续搜索了

========================================================

那如果父进程某个vma的所有页对于其子进程已经都发生过COW,是否可以将其从AVC中删除掉呢??

抛些其他疑问:

  1. anon page rmap和file page rmap的区别?
    • address_space的优先树
    • anon_vma的红黑树
  2. 为何不在每个page中定义跟踪映射链?
    • 以page为单位,太浪费内存了,目前page的开销:1G内存大概需要16M;
  3. 一个进程的不同虚拟地址能否映射到同一个物理地址?可以的话,那rmap如何兼容这个case?
  4. demand paging请求调页是啥?等同于page fault?
原文地址:https://www.cnblogs.com/zengjianrong/p/12201411.html