作者:XhiaoSai_263 | 来源:互联网 | 2024-11-25 18:30
在阅读关于PCI驱动程序章节的第15页时,我遇到了一个疑问,即I/O地址与内存区域之间究竟有何不同。
这部分内容提到:PCI设备最多可实现六个I/O地址区域,每个区域要么是内存映射,要么是I/O映射。
为了更好地理解这两者之间的差异,我们需要深入了解设备如何通过不同的方式寻址。
I/O映射的设备使用特定的指令和控制信号来访问I/O空间,而内存映射的设备则使用与访问普通内存相同的指令集,只不过数据的目标或来源是设备而非内存。
对于PCI设备而言,它们既可以通过I/O映射,也可以通过内存映射进行访问。我们可以通过运行命令 lspci -v
来查看具体的映射情况。
例如,下面是一个基于PCI的并行控制器的输出:
01:0c.2 并行控制器:NetMos Technology PCI 9865 多I/O控制器(prog-if 03 [IEEE1284])
子系统:设备a000:2000
标志:总线主控, 中等开发, 延迟0, IRQ 20
I/O端口 ed00 [size=8]
I/O端口 ec00 [size=8]
内存 fddfa000 (32位, 不可预取) [size=4K]
内存 fddf9000 (32位, 不可预取) [size=4K]
功能:<访问被拒绝>
使用的内核驱动程序:parport_pc
内核模块:parport_pc
从这个例子中可以看出,该设备同时映射到了I/O区域和内存区域。这意味着无论是通过I/O端口还是内存地址,都可以访问到设备的寄存器。在这个案例中,设备利用了全部六个可用的I/O区域中的四个(两个I/O映射和两个内存映射)。