匿名页的反向映射

在这里插入图片描述

反向映射的建立过程

当通过fork创建子进程的时候,在这个过程中会建立反向映射的基础结构,具体在
kernel_clone -》 copy_mm -》 dup_mm -》 dup_mmap中:

  1. dup_mmap中会将父进程中的每一个vma 复制一份给子进程,此处只是举例说明复制一个vma的情况,如上图中子进程的vma
  2. anon_vma_clone中创建子进程的avc01,它同时与父进程的av0和子进程的vma建立关联,即加入子进程的vma链表,同时连入父进程av0的红黑树,它是作为子进程的一个代表加入到父进程av0的红黑树,将来父进程查找反向映射时,将遍历这颗红黑树,进而获得vma,而子进程进行反向映射时,仅仅遍历自己av的红黑树即可,这样提升了效率;
  3. 通过anon_vma_alloc为子进程分配自己的av1,它与父进程的av0形成父子关系;
  4. 通过anon_vma_chain_alloc为子进程分配自己的avc1;
  5. 通过anon_vma_chain_link建立子进程av1, avc1, vma的关联

注:如上av为strucdt anon_vma, avc为anon_vma_chain

反向映射的查找过程

  1. 通过page的mapping字段找到av;
  2. 遍历av的红黑树,找到所有的avc;
  3. 通过avc找到对应的vma,并通过vma找到vma_start,及vm_mm进而找到pgd;
  4. 通过page->index和vma_start得到虚拟页的起始地址;
  5. 通过虚拟页的起始地址和pgd找到pte

参考文档

《Linux内核深度解析》
《深入理解Linux内核反向映射机制》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值