【问题标题】:How to know whether a page is/may be used for DMA?如何知道一个页面是否/可以用于 DMA?
【发布时间】:2021-12-11 12:58:18
【问题描述】:

我想跟踪正在/可能用于 DMA 的页面。

我只知道 DMA 的一个页面是“锁定的”,并且它的物理位置不允许在主内存中改变。但是我如何判断一个页面是否被“锁定”呢? (我猜是在 struct page 中使用标志)或者有更好的方法来知道页面是否用于 DMA?

【问题讨论】:

  • 一般来说任何页面都可以用于 DMA,您的问题到底是什么?

标签: linux memory-management kernel dma


【解决方案1】:

我不是专家,但根据我在这里和那里阅读的内容,无法知道页面是否用于 DMA。就像你说的,在页面结构中有一个无符号长的标志字段。在这个标志字段中,有一个锁定位告诉 Linux 不要将页面交换出主内存。知道这一点的最好方法是跨越所有进程及其地址空间并检查页面是否锁定在主内存中。通常,锁定页面的是设备驱动程序。这对于避免设备写入调用进程无法通过虚拟地址访问的物理地址是必要的。如果设备驱动程序没有锁定页面,设备将写入一个物理帧,该帧可能被换出或更改虚拟机映射,这将是灾难性的。该方法也不会告诉您内核的 dma。内核有时可以像交换页面时那样做 dma IO。

【讨论】:

  • 谢谢@user123,但是我怎么知道一个页面在物理内存中被“锁定”了,也就是说,它不会被换出或迁移。这篇文章 (stackoverflow.com/questions/48931940/…) 显示了持有 struct page 的 refcount 将相应的物理页面固定。还有其他情况吗?
  • 我猜如果设置了锁定位。如果 refcount > 0。类似的东西。内核可能不计算正在执行 DMA 的页面。就其本身而言,这个计数对内核毫无用处。我不明白你为什么需要这个计数。
猜你喜欢
  • 2016-08-20
  • 2012-12-23
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多