c - 识别DMA内存在/proc/mtrr和/proc/iomem中?

标签 c memory linux-kernel dma

我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrriomem,或者通过lspic -vv .

在我的/proc/mtrr中,只有一个无法缓存区域,它似乎几乎指向3.5-4GB处的“PCI洞”。

base=0x0e0000000 ( 3584MB), size=  512MB, count=1: uncachable

通过与 /proc/iomem 进行交叉验证,在这个 512MB 区域中,只有 4GB 之前的最后 21 MB 没有被 PCI 总线消耗,而这 21MB 条子被诸如 之类的东西占用pnp/IOAPIC/保留

所以我的问题是:

  1. /proc/mtrr/proc/iomem 中 DMA 区域的签名是什么
  2. 还有其他地方(例如其他 proc 文件和命令)可以用来查看 DMA 区域吗?
  3. 似乎通过向 /proc/mtrr 添加行,特权用户可以在运行时更改任何内存的缓存机制。那么除了DMA必须是低32位(假设没有DAC)之外,DMA内存分配还有其他特殊要求吗?如果没有进一步的要求,那么也许我可以用来识别 DMA 内存的唯一提示是 /proc/mtrr

最佳答案

DMA(直接内存访问)是设备访问内存本身的地方(不要求 CPU 将数据提供给设备)。 DMA 的(简化)示例;想象一个随机进程执行 write(),并且它向上冒泡(通过 VFS、通过文件系统、通过任何 RAID 层等),直到到达某种磁盘 Controller 驱动程序;然后磁盘 Controller 驱动程序告诉其磁盘 Controller “从该物理地址传输 N 个字节到磁盘上的该位置,并在传输完成时通知我”。大多数设备(磁盘 Controller 、网卡、显卡、声卡、USB Controller 等)都以某种方式使用 DMA。在负载下,计算机中的所有设备每秒可能会进行数千次传输(通过 DMA),并且可能分散在所有可用 RAM 中。

据我所知; /proc/ 中没有任何可以提供帮助的文件(很可能是因为它变化太快且太频繁而懒得提供任何文件,并且任何人都没有理由想要查看它)。

MTTR 大多无关紧要 - 它们仅控制 CPU 的缓存,对来自设备的 DMA 请求没有影响。

/proc/iomem 也是无关紧要的。它仅显示设备将哪些区域用于自己的寄存器,与 RAM 无关(因此与 DMA 无关)。

注 1:DMA 不必是低 32 位(例如,大多数 PCI 设备已经支持 64 位 DMA/总线主控十年或更久);对于不支持 64 位的极少数设备,Linux 可以使用 IOMMU 重新映射其请求(因此设备认为它正在使用 32 位地址,但实际上并非如此)。

注2:很久以前(很久以前)有“ISA DMA Controller 芯片”。就像 ISA 总线本身一样;它们仅限于物理地址空间的前 16 MiB(并且有其他限制 - 例如不支持跨越 64 KiB 边界的传输)。自从软盘 Controller 过时以来,这些芯片就没有真正存在的理由了。您可能有一个 /proc/dma 来描述这些(但如果您这样做,可能只会显示“级联”来指示芯片如何连接,而没有设备使用它们)。

关于c - 识别DMA内存在/proc/mtrr和/proc/iomem中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011065/

相关文章:

linux - RSS 是否包含内核空间内存?

c - Linux 内核 : Wait for other threads to complete

bash - 是否可以通过利用管道为 linux 制作类似于 OSX 服务的东西?

c++ - 创建计算器有多少个函数?

linux-kernel - 内核 x86_64 中的 syscall_table 位于何处?

c - fork 示例输出

c - 使用 fgets 将行复制到字符串数组中?

c - 在 C linux 中打开文件

c - C 中的越界地址/指针

c++ - 从偏移创建一个 DWORD 指针