我在Linux内核驱动程序中使用get_user_pages
来固定内存以用于[硬件] DMA。所有似乎都能正常工作 - 但我很难证明“钉住”正在做正确的事情。
当我在get_user_pages
之后检查物理页面上的标志时 - 页面看起来没有“锁定”(正如人们可能认为的那样)。事实上,我发现其他“活跃”页面的标记与我通过get_user_pages
“固定”的标记没有区别。
我看到唯一的区别是get_user_pages在页面上占用了引用计数。所以我想我的问题是 - 持有此引用单独足以保证此页面永远不会被换出,移动,或者我的用户空间的vaddr仍将/始终引用相同的底层页面?
我能找到的所有驱动源似乎都使用这种机制,文档似乎表明这是正确的方法 - 但我很难“证明”这将给我正确,可靠,预期的行为
答案 0 :(得分:4)
保留引用计数看起来足以防止页面被推出,失效或迁移;因此对于dma型操作是安全的。迁移在Documentation / vm / page_migrate中进行了讨论;其他要求在vm代码中进行拼写。简短的版本是要推送页面,需要删除其所有引用。
请注意,refcount和mapcount是不同的概念-mapcount仅表示有人对其进行虚拟引用; refcount表示他们有实际引用。换出的页面可能具有较大的地图计数。
还请注意,自https://lkml.org/lkml/2019/11/25/684起,此功能的界面不太模糊。