我想在我的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?
答案 0 :(得分:0)
您正在使用的PCI设备使用32位寻址模式。 当您的PC枚举BAR并将物理地址写入BAR时。它写了一个掩码值,只写了64位的低32位(在主机地址空间中) 打印OS / BIOS为驱动程序上的BAR分配的物理地址并进行比较。
此外,这是一个实际地址,因此无论如何你都不能iowrite
。
所以我不太了解你的目标。