PCIe 64位非预取空间

时间:2012-05-04 22:12:26

标签: pci pci-e

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

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

  2. 假设规范允许它(并且我的读数确实如此),广泛使用的BIOS是否支持它?或者它是否在理论上允许但在实践中没有完成?

2 个答案:

答案 0 :(得分:9)

TL; DR /简答

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

  • 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位
  • 扩展I / O基地址的高位30:16
  • 扩展I / O限制地址的高位32:16

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