配置空间寄存器是映射到内存空间还是IO空间?

时间:2017-06-09 16:32:27

标签: x86 hardware

我已经读过每个PCI设备功能都有一组称为配置空间的寄存器,而这个配置空间是256字节长。您可以使用以下两个端口映射的I / O地址访问这些寄存器:

CONFIG_ADDRESS 0x3f8
CONFIG_DATA 0x3fc

我的问题是,configuration space寄存器是否也映射到内存空间或IO空间?或者访问它们的唯一方法是通过0x3f80x3fc

3 个答案:

答案 0 :(得分:4)

PCI配置地址空间确实是每个设备256个字节。对于PCIe,每个器件扩展到2K寄存器,旧格式的寄存器没有空间用于地址位。

PCIe要求增强配置访问机制,它必须是一个平坦的内存映射地址空间来访问设备配置寄存器"与PC兼容的x86上。 MCFG ACPI表提供配置寄存器映射的基址,并在PCI固件规范中进行了描述。

实际上,固件选择较大的(通常需要256M来映射所有可能的256个总线)地址空间块并相应地配置北桥。英特尔为CPU提供公共处理器数据表,供您查看详细信息。

为了向后兼容,可以通过CONFIG_A / D io端口执行初始配置访问或访问传统(< = 255)配置寄存器。

答案 1 :(得分:1)

这些是正常的IO操作(使用IN和OUT汇编程序命令)。尽管硬件也可能将这些映射到MEM地址空间,但是不值得使用它,因为每个PCI兼容硬件必须支持对PCI的传统访问(我们一直在谈论PC)。

拇指规则 - 低位地址(低于0xFFFF)如上所述是常规I / O,高地址如0xFFFFFFxx或0xFFFFFFFFFFFFxxxx将是内存映射IO。

答案 2 :(得分:1)

让我通过显示PCI和PCI Express配置空间之间的差异来解释这一点。 在枚举过程中,BIOS访问配置空间以执行PCI设备的初始化。 BIOS将必须首先访问端点设备的配置空间,以便为其设置MMIO或IO地址范围(如果设备通过BAR寄存器请求MMIO或IO地址,以访问其内部存储器)。 英特尔架构提供了两个端口地址0xCFC(配置数据端口)和0xCF8(配置地址端口)来访问PCI设备的配置空间。 BIOS将BUS-DEVICE-FUNCION-CONFIG_REGISTER_OFFSET写入0xCF8以访问配置空间中的特定寄存器,然后将从0xCFC(配置数据端口)中获取寄存器的值,这些操作通过调用OUT和IN指令完成。这种访问配置空间寄存器的机制称为传统/ PCI配置访问机制。

PCI提供256字节的配置空间,但对于PCI Express设备,该空间已增加到4KB。现在,如果您看一下PCI配置空间机制的地址格式,您会发现已经提供了1个字节来提供要在PCI配置空间中访问的寄存器的偏移量。因为可以以1字节的偏移量(256个条目)访问整个256字节的配置空间,所以这对PCI设备是完全有意义的。但是对于PCI Express设备,只能通过此机制访问前256个字节的配置空间,该机制将不支持访问剩余的PCIe配置空间!

现在让我们讨论一下PCI Express中使用的ECAM(增强配置访问机制)来访问PCIe设备的配置空间。在这种机制中,会将4KB的配置空间映射到称为内存映射配置的内存中,该机制将提供12位用于偏移要访问的配置寄存器。

要回答您的问题,配置空间寄存器仅映射到PCI Express设备而不映射到内存空间(MM config)。 PCI配置空间不会映射到MMIO或IO地址空间,它将由如上所述的两个端口寄存器进行访问。