我一直在阅读PCIe规范的恐怖,但仍然无法对以下问题对得到任何解决方案。
PCIe是否允许映射超过4GB边界的巨大(例如16GB)64位非预取内存空间?或者它们仍然与32位时的1GB相同,并且没有办法要求巨大的非预取空间?
假设规范允许它(并且我的读数确实如此),广泛使用的BIOS是否支持它?或者它是否在理论上允许但在实践中没有完成?
答案 0 :(得分:9)
没有。对非预取内存的BAR请求仅限于使用低32位地址空间。
http://www.pcisig.com/reflector/msg03550.html
答案是否定的原因与PCI内部有关。描述PCI总线所包含的存储器范围的数据结构仅保留足够的空间来存储32位基址并限制非可预取存储器和I / O存储器范围的地址。但是,它确实保留了足够的空间来存储64位基数并限制了可预取的内存。
具体来说,请查看{3}},图3(PCI-to-PCI桥接器)。这显示了PCI配置空间标头类型0x01(PCI到PCI桥的标头格式)。请注意,从该表中的寄存器1C开始,有:
实际地址是通过将这些寄存器(部分)与0(对于基地址)或1(对于极限地址)连接在一起而创建的。 I / O和不可预取的基址和限制地址是32位,因此形成:
Bit# 31 20 19 16 15 0
I/O Base: [ 16 upper bits : 4 middle bits : 12 zeros ]
I/O Limit: [ 16 upper bits : 4 middle bits : 12 ones ]
Non-prefetchable Base: [ 12 bits : 20 zeros ]
Non-prefetchable Limit: [ 12 bits : 20 ones ]
可预取的基址和限制地址为64位,因此形成:
Prefetchable Base:
Bit# 63 32
[ 32 upper bits ]
[ 12 middle bits : 20 zeros ]
Bit# 31 16 15 0
Prefetchable Limit:
Bit# 63 32
[ 32 upper bits ]
[ 12 middle bits : 20 ones ]
Bit# 31 16 15 0
如您所见,只有可预取的存储器基和限制寄存器被赋予足够的位来表示64位地址。所有其他的仅限于32个。
答案 1 :(得分:1)
PCIe可以定义64b内存寻址。 BAR(基址寄存器)的定义和用法在 PCI 3.0 规范(第6.2.5.1节“地址映射”)中定义,而不是在 PCIe 规范中。