反向映射和写时复制
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中删除掉呢??
抛些其他疑问:
- anon page rmap和file page rmap的区别?
- address_space的优先树
- anon_vma的红黑树
- 为何不在每个page中定义跟踪映射链?
- 以page为单位,太浪费内存了,目前page的开销:1G内存大概需要16M;
- 一个进程的不同虚拟地址能否映射到同一个物理地址?可以的话,那rmap如何兼容这个case?
- demand paging请求调页是啥?等同于page fault?