【发布时间】:2016-12-08 04:54:18
【问题描述】:
我想在我的 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?
【问题讨论】:
-
条不能只写入,它们需要映射到虚拟内存。驱动程序通常在初始化之后执行它。您需要写入该地址 + 偏移量。
-
@stdcall 我知道,这就是在源代码中实现的方式。但我的问题略有不同——我的主机运行的是内核为 4.4.0 的 64 位 Ubuntu。查看我的
lspci -v输出,我们可以看到PCI 条地址是32 位的。所以我想知道/怀疑ioread32是 64 位地址的参数会导致未定义的行为。 -
啊。知道了。给你一个答案。
标签: linux-kernel kernel linux-device-driver