Linux中的“固定”页面如何呈现(或实际上“固定”)自己

Bra*_*rad 5 c memory-management linux-device-driver linux-kernel

get_user_pages在 Linux 内核驱动程序中使用来固定内存以用于 [硬件] DMA。一切似乎都很好 - 但我很难证明“固定”正在做正确的事情。

当我在做完之后检查物理页面上的标志时get_user_pages- 页面不会出现“锁定”(正如人们可能认为的那样)。事实上,我认为其他“活动”页面的标志与我通过get_user_pages.

我看到的唯一区别是 get_user_pages在页面上进行了引用计数。所以我想我的问题是 -单独持有这个引用是否足以保证这个页面永远不会被换出、移动,或者我的用户空间的 vaddr 仍然/总是引用相同的底层页面?

我能找到的所有驱动程序源似乎都使用这种机制,文档似乎表明这是正确的方法 - 但我很难“证明”这会给我正确、可靠、预期的行为。

mev*_*ets 6

持有引用计数看起来足以防止页面被推出、失效或迁移;因此对于 DMA 类型的操作来说是安全的。迁移在 Documentation/vm/page_migrate 中讨论;其他的需要在虚拟机代码中进行探索。简而言之,推送页面需​​要删除其所有引用。

请注意,refcount 和 mapcount 是不同的概念——mapcount 只是意味着某人对它有一个虚拟引用;refcount 意味着他们有对其的实际引用。换出的页面可能有大量的地图计数。

另请注意,从https://lkml.org/lkml/2019/11/25/684开始,有一个不太晦涩的界面。