PCIe 64位非预取空间

Rga*_*ddi 7 pci pci-e

我一直在阅读PCIe规范的恐怖,但仍无法对以下问题对得到任何解决方案.

  1. PCIe是否允许映射超过4GB边界的巨大(例如16GB)64位非预取内存空间?或者它们仍然与32位时的1GB相同,并且没有办法要求巨大的非预取空间?

  2. 假设规范允许它(以及我的读取它),广泛可用的BIOS支持它吗?或者它在理论上是允许的,但在实践中却没有完成?

Iwi*_*ist 9

TL; DR /简答

对非预取内存的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开始,有:

  • 1C:I/O基地址的8(中)位.只有前4位可用.
  • 1D:I/O限制地址的8(中间)位.只有前4位可用.
  • 忽略1E-1F.
  • 20:16位用于非可预取的存储器基地址.只有前12位可用.
  • 22:16位用于非可预取的存储器限制地址.只有前12位可用.
  • 可预取存储器基地址的24:16(中)位
  • 26:16(中)位用于可预取的存储器限制地址
  • 28:32高位用于扩展的可预取存储器基址
  • 2C:32个高位用于扩展的可预取存储器限制地址
  • 30:16高位用于扩展I/O基址
  • 32:16高位用于扩展I/O限制地址

实际地址是通过将这些寄存器(部分)与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.