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

时间:2018-02-22 16:03:18

标签: linux-kernel linux-device-driver

我在Linux内核驱动程序中使用get_user_pages来固定内存以用于[硬件] DMA。所有似乎都能正常工作 - 但我很难证明“钉住”正在做正确的事情。

当我在get_user_pages之后检查物理页面上的标志时 - 页面看起来没有“锁定”(正如人们可能认为的那样)。事实上,我发现其他“活跃”页面的标记与我通过get_user_pages“固定”的标记没有区别。

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

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

1 个答案:

答案 0 :(得分:4)

保留引用计数看起来足以防止页面被推出,失效或迁移;因此对于dma型操作是安全的。迁移在Documentation / vm / page_migrate中进行了讨论;其他要求在vm代码中进行拼写。简短的版本是要推送页面,需要删除其所有引用。

请注意,refcount和mapcount是不同的概念-mapcount仅表示有人对其进行虚拟引用; refcount表示他们有实际引用。换出的页面可能具有较大的地图计数。

还请注意,自https://lkml.org/lkml/2019/11/25/684起,此功能的界面不太模糊。