我目前正在阅读KSM(内核同页合并(代码。我已经看到在该代码中使用了几个锁:down_read/upred mmap_sem、lock_page((和页表锁(例如:pte_offset_map_lock(。
据我所知,
mmap_sem:mm锁,用于保护vma
页面锁:用于锁定结构页面(但我可以在不更改页面描述符的情况下修改页面的内容(
页表锁:锁定pte
它们都无法阻止页面内容的更改。
那么,有什么锁可以做到这一点吗?ksm如何确保页面内容在合并两个相同的页面之前不会发生更改?通过写保护这些页面?在这种情况下,一旦发现两个页面的内容相同,它就应该对页面进行写保护,但在代码中,情况似乎并非如此。
pte_wrprotect在合并之前以及之后在COW映射虚拟页面。