如何在64位Linux内核环境中读取32位PCI条形内存

时间:2016-08-02 17:42:46

标签: linux-kernel kernel linux-device-driver

我想在我的PCIe设备上进行I / O操作。我正在使用Linux内核4.4.0运行Ubuntu 16.0.4 LTS

lspci -v命令的输出为:

06:00.0 Unclassified device [00ff]: Device 1aa1:2000 (rev 01)
    Subsystem: Device 1aa1:2000
    Physical Slot: 1-4
    Flags: bus master, fast devsel, latency 0, IRQ 16
    Memory at f1008000 (32-bit, non-prefetchable) [size=8K]
    Memory at ee000000 (32-bit, non-prefetchable) [size=32M]
    Memory at f100a000 (32-bit, non-prefetchable) [size=4K]
    Memory at f0000000 (32-bit, non-prefetchable) [size=16M]
    Memory at f1000000 (32-bit, non-prefetchable) [size=32K]
    Capabilities: <access denied>
    Kernel driver in use: my_pci
    Kernel modules: my_pci

显然,PCI地址是32位的。

我想知道如何使用ioread32 / iowrite32函数读/写BAR地址。 我的机器上的unsigned char __iomem *mem类型将是64位,如果我使用以下说法:

ioread32(mem + some_offset);

表达式mem + some_offset将是64位并导致崩溃。

我该如何进行I / O?

1 个答案:

答案 0 :(得分:0)

您正在使用的PCI设备使用32位寻址模式。 当您的PC枚举BAR并将物理地址写入BAR时。它写了一个掩码值,只写了64位的低32位(在主机地址空间中) 打印OS / BIOS为驱动程序上的BAR分配的物理地址并进行比较。

此外,这是一个实际地址,因此无论如何你都不能iowrite

所以我不太了解你的目标。