Linux 中的 "pinned" 页面如何呈现(或实际上 "pin")它们自己
How do "pinned" pages in Linux present (or actually "pin") themselves
我在 Linux 内核驱动程序中使用 get_user_pages
来固定内存以用于 [硬件] DMA。这一切 似乎 工作正常 - 但我很难证明 "pinning" 正在做正确的事情。
当我在完成 get_user_pages
后检查物理页面上的标志时 - 页面没有出现 "locked"(人们可能认为它们应该出现)。事实上,我发现其他 "active" 页面的标志与我通过 get_user_pages
获得的 "pinned" 页面的标志没有区别。
我看到的唯一区别是get_user_pages在页面上取得了refcount。所以我想我的问题是 - 单独持有此引用 是否足以保证此页面永远不会被换出、移动或我的用户 space 的 vaddr still/always 会引用相同的底层页面吗?
我能找到的所有驱动程序源似乎都使用这种机制,文档似乎表明这是正确的方法 - 但我很难 "proving" 这会给我正确的方法,可靠的、预期的行为。
保持引用计数看起来足以防止页面被推出、失效或迁移;因此对于 DMA 类型的操作是安全的。 Documentation/vm/page_migrate 中讨论了迁移;其他人需要在 vm 代码中进行 spelunking。简短的版本是推送页面需要删除所有引用。
请注意 refcount 和 mapcount 是不同的概念 -- mapcount 只是意味着有人对它有一个虚拟引用; refcount 意味着他们有一个实际的引用。换出的页面可以有很大的映射数。
另请注意,从 https://lkml.org/lkml/2019/11/25/684 开始,有一个不那么晦涩的界面。
我在 Linux 内核驱动程序中使用 get_user_pages
来固定内存以用于 [硬件] DMA。这一切 似乎 工作正常 - 但我很难证明 "pinning" 正在做正确的事情。
当我在完成 get_user_pages
后检查物理页面上的标志时 - 页面没有出现 "locked"(人们可能认为它们应该出现)。事实上,我发现其他 "active" 页面的标志与我通过 get_user_pages
获得的 "pinned" 页面的标志没有区别。
我看到的唯一区别是get_user_pages在页面上取得了refcount。所以我想我的问题是 - 单独持有此引用 是否足以保证此页面永远不会被换出、移动或我的用户 space 的 vaddr still/always 会引用相同的底层页面吗?
我能找到的所有驱动程序源似乎都使用这种机制,文档似乎表明这是正确的方法 - 但我很难 "proving" 这会给我正确的方法,可靠的、预期的行为。
保持引用计数看起来足以防止页面被推出、失效或迁移;因此对于 DMA 类型的操作是安全的。 Documentation/vm/page_migrate 中讨论了迁移;其他人需要在 vm 代码中进行 spelunking。简短的版本是推送页面需要删除所有引用。
请注意 refcount 和 mapcount 是不同的概念 -- mapcount 只是意味着有人对它有一个虚拟引用; refcount 意味着他们有一个实际的引用。换出的页面可以有很大的映射数。
另请注意,从 https://lkml.org/lkml/2019/11/25/684 开始,有一个不那么晦涩的界面。