我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrr
和iomem
,或者通过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/保留
。
所以我的问题是:
/proc/mtrr
和/proc/iomem
中 DMA 区域的签名是什么- 还有其他地方(例如其他 proc 文件和命令)可以用来查看 DMA 区域吗?
- 似乎通过向
/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/