【问题标题】:communicating with a PCI device through /dev/mem通过 /dev/mem 与 PCI 设备通信
【发布时间】:2016-07-12 19:02:22
【问题描述】:

我需要通过/dev/mem 与内存 PCI 设备通信。为什么?原因有很多,其中一个是因为我的老板告诉我的。

我想我有我的答案here。但是我想不通的是答案中的MMIO_ADDR。如果我想与特定的内存区域进行通信,我会使用存储在BAR 寄存器中的值作为我的MMIO_ADDR 吗?如果不是,我该如何与我的 PCI 设备通信?

【问题讨论】:

    标签: c pci memory-mapping


    【解决方案1】:

    BIOS/内核将为您的 BAR 分配一个地址。系统启动时,该地址应该已写入 PCI 配置头中的 BAR 地址寄存器。

    例如,在我这里的一个VM上,e1000设备如下(来自lspci -v):

    02:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
            Subsystem: VMware PRO/1000 MT Single Port Adapter
            Physical Slot: 35
            Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 17
       =>   Memory at fd560000 (64-bit, non-prefetchable) [size=128K]
            Memory at fdfd0000 (64-bit, non-prefetchable) [size=64K]
            I/O ports at 2080 [size=64]
            [virtual] Expansion ROM at fd520000 [disabled] [size=64K]
            Capabilities: <access denied>
            Kernel driver in use: e1000
    

    您需要阅读该信息(您可以通过/proc/bus/pci/&lt;Bus&gt;/&lt;DevFn&gt;/sys/bus/pci/devices/ 以二进制形式访问它)以找到MMIO 地址。

    例如dump上面设备的PCI配置空间的二进制显示:

    od -tx1z -Ax /proc/bus/pci/02/03.0
    000000 86 80 0f 10 17 01 30 02 01 00 00 02 10 00 00 00  >......0.........<
    000010 04 00 56 fd 00 00 00 00 04 00 fd fd 00 00 00 00  >..V.............<
    000020 81 20 00 00 00 00 00 00 00 00 00 00 ad 15 50 07  >. ............P.<
    000030 00 00 00 00 dc 00 00 00 00 00 00 00 0b 01 ff 00  >................<
    000040
    

    第一个 BAR(条形区域 #0)位于偏移量 0x10,第二个(条形区域 #2)位于偏移量 0x18。

    有关布局和解释的说明,请参阅https://en.wikipedia.org/wiki/PCI_configuration_space

    【讨论】:

    • 我有办法提取 BAR 值。但我的问题仍然存在,我需要为MMIO_ADDR 使用 BAR 值吗?
    • 我认为您的回复有误。第二条应该在 0x14
    • 嗯,lspci 显示的第二个。我会澄清
    • 顺便说一句,如果你运行lspci -vvv,它会准确显示哪个 BAR 是哪个。
    • 是的,BAR 内存地址基址是您需要用于 mmap 调用的地址基址。 mmap 所需的内存量会有所不同。您可能不需要映射整个 BAR 区域。事实上,您可能只需要映射一页。这取决于特定设备对该区域的用途。
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多