【发布时间】:2016-02-28 12:23:47
【问题描述】:
我正在寻找一种在不使用 DMA 和 IO 映射的情况下访问 PCI 设备(显式 BAR2 和 BAR3)内存空间的方法。我已经阅读了很多文档,但我从未见过流程图或一步一步的操作方法。所以我所有的尝试都没有成功。
这些是pci_probe里面的步骤我实际尝试过:
data = kzalloc( sizeof(*data) , GFP_KERNEL );pci_set_drvdata(pdev, data);pci_enable_device(pdev);
现在的问题是使用writeb 或readb 访问BAR2+offset 的正确地址是什么?或者是否有另一个函数可以从这个空间读取/写入?
PS:关于iomap 的类似问题已发布here。
【问题讨论】:
-
如果没有映射,您将无法访问任何内容。您要解决的实际问题是什么?
-
目标是访问 PCI 设备上的内存空间以进行快速数据交换。我知道我需要映射地址。但我读到有两种不同类型的映射。 IO-mapping 到达 IO 空间和 Memory-mapping 到达内存空间。我知道通过 io 映射到达内存空间的方法,但现在我正在寻找通过内存映射更快的方法。
-
据我所知,在 x86(-64) 上,您只能通过 I/O 映射映射 I/O BAR,通过内存映射映射内存 BAR。其他架构不一定有区别,它们的实现可能对 I/O 范围使用内存映射(例如 PPC)。
-
好的。以及如何通过内存映射来映射内存BAR?
-
pcim_iomap_regions()是您的帮手。如果您询问通过 PCI 总线连接的内存,那么您可能必须将pci_resource_*()与memremap()结合使用。
标签: linux-kernel kernel kernel-module pci