gpt4 book ai didi

PCIe 64 位不可预取空间

转载 作者:行者123 更新时间:2023-12-01 16:03:47 28 4
gpt4 key购买 nike

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

  1. PCIe 是否允许将巨大(例如 16GB)64 位不可预取内存空间映射到 4GB 边界以上?或者它们仍然与 32 位时代一样受限于 1GB,并且无法调用大片不可预取的空间?

  2. 假设规范允许(据我所知确实如此),广泛使用的 BIOS 是否支持它?还是理论上允许但实践中不这样做?

最佳答案

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 至 PCI 桥接器)。这显示了 PCI 配置空间 header 类型 0x01(PCI 到 PCI 桥的 header 格式)。请注意,从该表中的寄存器 1C 开始,有:

  • 1C:8(中间)位用于 I/O 基地址。仅前 4 位可用。
  • 1D:8(中间)位用于 I/O 限制地址。仅前 4 位可用。
  • 忽略 1E-1F。
  • 20:16 位用于不可预取的内存基地址。仅前 12 位可用。
  • 22:16 位用于不可预取的内存限制地址。仅前 12 位可用。
  • 24:16(中间)位用于可预取内存基地址
  • 26:16(中间)位用于可预取内存限制地址
  • 28:扩展可预取内存基地址的 32 个高位
  • 2C:32 个高位用于扩展可预取内存限制地址
  • 30:扩展I/O基地址的高16位
  • 32:扩展I/O限制地址的高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 个。

关于PCIe 64 位不可预取空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10456779/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com