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 仍然/总是引用相同的底层页面?
我能找到的所有驱动程序源似乎都使用这种机制,文档似乎表明这是正确的方法 - 但我很难“证明”这会给我正确、可靠、预期的行为。
持有引用计数看起来足以防止页面被推出、失效或迁移;因此对于 DMA 类型的操作来说是安全的。迁移在 Documentation/vm/page_migrate 中讨论;其他的需要在虚拟机代码中进行探索。简而言之,推送页面需要删除其所有引用。
请注意,refcount 和 mapcount 是不同的概念——mapcount 只是意味着某人对它有一个虚拟引用;refcount 意味着他们有对其的实际引用。换出的页面可能有大量的地图计数。
另请注意,从https://lkml.org/lkml/2019/11/25/684开始,有一个不太晦涩的界面。
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |