首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PCIe 64位不可取空间

PCIe 64位不可取空间
EN

Stack Overflow用户
提问于 2012-05-04 22:12:26
回答 2查看 12.5K关注 0票数 7

我一直在阅读PCIe规范这一可怕的东西,但仍然无法对下面的问题进行任何解决。

  1. PCIe允许在4GB边界之上映射巨大的(例如16 4GB)64位不预取内存空间吗?或者他们仍然和32位的时候一样被绑在1GB,而且没有办法去调用规范所允许的大量不可获取的space?
  2. Assuming (据我的理解),BIOSes支持它吗?还是理论上允许,但在实践中却不允许?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 00:54:30

TL;DR /简短答案

不是的。对非预取内存的条形请求仅限于使用低32位地址空间.

http://www.pcisig.com/reflector/msg03550.html

长答案

答案是否定的原因与PCI内部设备有关。描述PCI总线所包含的内存范围的数据结构只保留足够的空间来存储非预取内存和I/O内存范围的32位基和限制地址。然而,它确实保留了足够的空间来存储64位基,并限制预取内存。

甚至更长的答案

具体来说,看看http://wiki.osdev.org/PCI#PCI_Device_Structure,图3(PCI到PCI桥)。这显示了PCI配置空间头类型0x01 (PCI到PCI桥的头格式)。请注意,从该表的寄存器1C开始,有以下内容:

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

<代码>H 12130: 16扩展I/O基地址H 222H 12332: 16为扩展I/O限制地址>H 224F 225>F 225

实际地址是通过连接(部分)这些寄存器和0(用于基址)或1(用于限制地址)来创建的。I/O和非预取基址和限制地址为32位,因此形成:

代码语言:javascript
复制
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位,形成如下:

代码语言:javascript
复制
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。

票数 12
EN

Stack Overflow用户

发布于 2012-07-01 19:59:57

PCIe可以定义64b内存寻址。BAR(基本地址寄存器)定义和使用在PCI3.0规范(第6.2.5.1章“地址映射”)中定义,而不是在PCIe规范中定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10456779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档