【问题标题】:How do "pinned" pages in Linux present (or actually "pin") themselvesLinux 中的“固定”页面如何呈现(或实际上是“固定”)自身
【发布时间】:2018-08-02 13:41:42
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c memory-management linux-kernel linux-device-driver


    【解决方案1】:

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

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

    另请注意,从 https://lkml.org/lkml/2019/11/25/684 开始,此界面不再那么晦涩。

    【讨论】:

    • 嗨@mevets,这是否意味着用户进程中的常规RAM永远不会在结构页面上进行引用计数?
    • 据我所见(我是一个内核书呆子;Linux 和 Windows 不在其中); refcount != 0 表示此页面有待处理的操作,因此您只能更新某些部分。读pte是没用的,它只是页面结构中存储的信息的投影。
    • 我试图编辑帖子中的物理内存、页面、vnodes 和映射之间的关系图。我帮了大家一个忙并删除了它。在常规 RAM 的程序概念和内核中的实现之间有无数的抽象。
    • 如果您改变主意,请随时发布该图表。对于像我这样的 joe schmoes,任何一点额外的信息都会有很大帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2021-03-25
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多