繁体   English   中英

如何从 PCIe 中的 BAR 地址计算 MMIO 映射区域的大小

[英]How to calculate size of MMIO-mapped region from BAR address in PCIe

我一直在深入研究 PCIe 的一般工作原理,但我被许多书籍和网站谈论 PCIe 配置空间的地方困住了。
到目前为止,我了解到的是,对于每个分配的设备及其 BDF(总线设备功能位),该设备对应一个 4KB 配置空间,其中包括如下 64B 区域:
64B空间
我了解每个基地址寄存器(代表内存映射区域)的解码如下:
条码解码
(两张图片均来自本站

我不明白区域的大小是如何确定的。 例如,在一台服务器中,对于连接到 BDF 00:05.0命令lspci -x -v -s 05:00.0的 GPU ,我得到以下信息:

05:00.0 VGA compatible controller: NVIDIA Corporation GV100 [TITAN V] (rev a1) (prog-if 00 [VGA controller])
    Subsystem: NVIDIA Corporation GV100 [TITAN V]
    Flags: bus master, fast devsel, latency 0, IRQ 80, NUMA node 0
    Memory at f8000000 (32-bit, non-prefetchable) [size=16M]
    Memory at a0000000 (64-bit, prefetchable) [size=256M]
    Memory at b0000000 (64-bit, prefetchable) [size=32M]
    I/O ports at d000 [size=128]
    [virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
    Capabilities: <access denied>
    Kernel driver in use: nvidia
    Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
00: de 10 81 1d 07 05 10 00 a1 00 00 03 00 00 80 00
10: 00 00 00 f8 0c 00 00 a0 00 00 00 00 0c 00 00 b0
20: 00 00 00 00 01 d0 00 00 00 00 00 00 de 10 18 12
30: 00 00 00 00 60 00 00 00 00 00 00 00 0b 01 00 00

我们可以看到BAR0的值为0xf8000000 但是我们怎么知道从地址0xf8000000开始的区域的大小呢? 从我检查过的一些网站( )他们谈到:
(1)找到地址的补码值,它应该是区域的长度(这对我来说在某些方面没有意义)或
(2)因为0xf80000001111 1000 0000 0000 0000 0000 0000 0000 ,所以区域的大小是2^27=128MB因为有 27 个连续的 0 直到它遇到第一个 1。

但是这两种方法都是错误的,因为lspci命令说特定区域映射了 16MB,而不是 128MB。

所以这是我真正的问题: 1. memory 区域大小应该如何计算? 2.另外,上面映射的memory加起来好像是16M+256M+32M+128(+128K),但是GPU的实际大小比ZCD69B4957F016CD818D7BF3E6小一点不是所有的 GPU memory 都通过 PCIe 映射到 MMIO 是对的吗?

提前致谢。

您提到的OSDev 链接定义了探测 BAR 的协议:

要确定 PCI 设备所需的地址空间量,您必须保存 BAR 的原始值,将全 1 的值写入寄存器,然后将其读回。 memory 的数量可以通过屏蔽信息位、执行按位非(C 中的“~”)并将值增加 1 来确定。然后应该恢复 BAR 的原始值。 BAR 寄存器自然对齐,因此您只能修改设置的位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM