区别通常在于设备的寻址方式。您问题中的“位置”一词通常是指设备映射,即设备是 I/O 映射还是内存映射。
两者的区别在于 I/O 映射 I/O 使用专用指令和控制信号来访问 I/O 空间,而内存映射 I/O 使用与访问内存相同的指令,在这种情况下,数据不是去(或来)到内存位置,而是去到设备。
就 PCI 设备而言,它能够映射到 I/O 和内存区域。可以使用lspci -v查看映射。
作为示例输出:
01:0c.2 Parallel controller: NetMos Technology PCI 9865 Multi-I/O Controller (prog-if 03 [IEEE1284])
Subsystem: Device a000:2000
Flags: bus master, medium devsel, latency 0, IRQ 20
I/O ports at ed00 [size=8]
I/O ports at ec00 [size=8]
Memory at fddfa000 (32-bit, non-prefetchable) [size=4K]
Memory at fddf9000 (32-bit, non-prefetchable) [size=4K]
Capabilities: <access denied>
Kernel driver in use: parport_pc
Kernel modules: parport_pc
上面的输出显示了基于 PCI 的并行端口的输出。在这里我们可以看到端口映射到 I/O 区域和内存区域。这两种机制中的任何一种都可用于访问设备寄存器。在设备可以寻址的六个 I/O 区域中,它使用了四个(两个 I/O 映射和两个内存映射)。