使用反向映射

建立反向映射的目的是为了能够查到某个页面当前在哪些进程中映射,相应的我们可以进行一些操作。比如clear, swap, migrate。

这个操作的框架基本是统一的,这里我们来学习一下相关的操作。

rmap_walk[_locked]

使用反向映射的核心函数是

  • rmap_walk

  • rmap_walk_locked

通常他们在被调用的时候都会出现,作为持锁和不持锁的两个分支。 顺便我们再来看看哪些函数会调用这两个,从而了解一下内核中什么操作会需要用到反向映射。

  • page_idle_clear_pte_refs

  • folio_referenced

  • folio_mkclean

  • try_to_unmap

  • try_to_migrate

  • remove_migration_ptes

而上面两个函数展开,我们可以看到真正的核心其实是:

  • rmap_walk_anon()

  • rmap_walk_file()

也就是对匿名页和文件页的遍历,因为这两者的反向映射实现是不同的。但是,实际上我们展开后,看到最核心的逻辑又是一样的。

根据给定的反向映射的RB_ROOT,遍历得到对应的vma。然后对应这个vma,分别执行

  • rwc->invalid_vma()

  • rwc->rmap_one()

  • rwc->done()

PS: rwc是struct rmap_walk_control,主要成员就是这三个回调函数。

事情真的就这么简单了吗?

page_vma_mapped_walk()

Last updated

Was this helpful?