我一直在阅读PCIe规范的恐怖,但仍无法对以下问题对得到任何解决方案.
PCIe是否允许映射超过4GB边界的巨大(例如16GB)64位非预取内存空间?或者它们仍然与32位时的1GB相同,并且没有办法要求巨大的非预取空间?
假设规范允许它(以及我的读取它),广泛可用的BIOS支持它吗?或者它在理论上是允许的,但在实践中却没有完成?
对非预取内存的BAR请求仅限于使用低32位地址空间.
http://www.pcisig.com/reflector/msg03550.html
答案是否定的原因与PCI内部有关.描述PCI总线所包含的存储器范围的数据结构仅保留足够的空间来存储32位基址并限制非可预取存储器和I/O存储器范围的地址.但是,它确实保留了足够的空间来存储64位基数并限制了可预取的内存.
具体来说,请查看http://wiki.osdev.org/PCI#PCI_Device_Structure,图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 ]
Run Code Online (Sandbox Code Playgroud)
可预取的基址和限制地址是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
Run Code Online (Sandbox Code Playgroud)
如您所见,只有可预取的存储器基和限制寄存器被赋予足够的位来表示64位地址.所有其他的仅限于32.