在我之前的问题,我确定 PCI/PCIe 设备使用的内存地址不必映射到系统 RAM,但也可以指“设备上”的内存,例如 RAM 或寄存器。
但在这种情况下,BAR 是如何设置的?
这仅仅是一个情况(在配置过程中):
- 例如,设备宣称自己希望公开 16MB 内存,
- BAR 被分配一个基地址,
- 此后,设备将偏移量映射到其内部存储器?
这与设备希望访问 16MB 系统内存(即设备没有自己的内存)有何不同?
谢谢!
编辑:寻址在以下情况下有何不同:
A:设备没有自己的内存,例如使用共享内存的视频适配器。B
:设备有内存,并与系统共享(例如带有 RAM 缓冲区的假设 HDD 适配器)。
在这两种情况下,BAR 是否由操作系统分配并占用可寻址内存?
对于 RAM 满载的系统来说,这种区别非常重要(例如,安装了 4 GB RAM 的 32 位系统能够支持具有 2 GB 共享 RAM 的视频适配器 [情况 (A)]。但是,同一系统对于带有板载 2 GB RAM 缓存的假设 HDD 适配器来说,没有剩余的地址空间 [情况 (B)]?
答案1
BAR 不用于系统 RAM 中的设备缓冲区,设备不会通过 BAR 请求此类缓冲区。相反,设备的主机寄存器接口规范将包括一项规定,即主机必须分配给定大小(或指定范围内的大小)的缓冲区,并将其提供给设备。
相反,主机驱动程序将从系统 RAM 中分配一个缓冲区,并告诉设备它在哪里(如果它不是固定大小,那么它有多大),可能只是将地址写入设备寄存器,也可能作为更复杂协议的一部分。
然后,设备通过启动针对缓冲区的内存读写事务,访问系统 RAM 缓冲区,就像访问与 I/O 操作相关的缓冲区一样。
答案2
您对 BAR 设置的解释是正确的。
那么它有何不同?
设备的板载内存/寄存器通常是一种特殊的 RAM,它可能是双端口 RAM(当每个单元有两个端口时,一个连接到主机总线,另一个连接到设备的内部总线,这允许从两侧进行更快和并发的访问),它可能是一个寄存器,甚至直接是一些 FPGA 的一些输入或输出 -现场可编程门阵列控制设备的一些逻辑。
设备可以通过 DMA 访问的主系统 RAM 通常具有完全不同的名称。在最常见的情况下,它用作设备的数据源或数据目标。例如,在磁盘驱动器的情况下,设备将访问该内存以读取数据或将数据写入介质。此类源和目标的位置不受系统缓冲区的限制。例如,分页(虚拟内存的换入和换出)直接执行到/从相关页面的物理页面地址。
另一种可能的 DMA 访问是设备向系统请求一些内存区域以满足自己的需要。其中一个例子是集成视频适配器,它通常没有自己的 RAM 来保存要在屏幕上显示的图像的二进制表示。然而,这种情况非常类似于磁盘写入操作。唯一的区别是它是连续的。
答案3
PCI(e) 设备无法请求专用的系统内存缓冲区,至少不能通过使用标准 PCI(e) 配置方法 (BAR) 来请求。通常唯一能做到这一点的设备是集成 GPU,它们在主板芯片组中具有保留内存缓冲区的特殊支持,但这些只能由系统 BIOS 理解和设置。