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

Linux kernel 如何在64位linux内核环境中读取32位PCI条内存,linux-kernel,kernel,linux-device-driver,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 Mem

我想在我的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
表达式
mem+some_offset
将为64位并导致崩溃


如何进行I/O?

您正在使用的PCI设备使用32位寻址模式工作。 当您的电脑枚举条形图并将物理地址写入条形图时。它只写入64位中较低的32位(主机地址空间中)的屏蔽值 在驱动程序上打印OS/BIOS分配给此条的物理地址,并进行比较

此外,这是一个物理地址,因此无论如何都不能
iowrite


所以我真的不明白你的目标。

条不能直接写入,它们需要映射到虚拟内存。驱动程序通常在初始化之后执行此操作。您需要写入该地址+偏移量。@stdcall我知道,这就是在源代码中实现的方式。但我的问题略有不同——我的主机运行的是64位Ubuntu内核4.4.0。查看我的
lspci-v
输出,我们可以看到PCI条地址是32位的。所以我想知道/怀疑
ioread32
的参数是64位地址会导致未定义的行为。啊。知道了。我有答案给你。这正是我在打印地址时发现的。谢谢你的回答。
ioread32(mem + some_offset);