我一直在阅读有关PCI子系统如何从Bootup,BIOS参与和设备地址映射(即BAR到系统内存)的配置。
从上图中我假设地址空间是物理4GB RAM,物理地址为4GB。因此,从3GB以上可以看出设备内存是映射的。 2GB物理RAM地址上的内存会发生什么变化。
如果假设我的假设是错误的,上面的地图显示了32位系统的虚拟地址。那么器件存储器如何映射到DMA的物理地址。映射是永久性的(不可交换和可更改)。
请帮助我理解这个概念。
答案 0 :(得分:0)
如果我理解你的问题,2GB系统上没有任何不同。只会有一个"洞"在2GB到3GB之间的物理地址空间;也就是说,这里只是一个解码地址的硬件设备。但是否则PCI设备没有显着差异:它们仍然会在3GB以上的区域内分配空间。
值得注意的是,您在上面显示的地图(物理地址空间)并不一定停在4GB(自1995年左右开始)。大多数现代x86处理器具有超过32个地址位。这就是为什么你现在经常得到超过4GB RAM的系统。地址空间中可能还有4GB以上的空洞。
实际上使用 4GB以上的RAM需要处理器的64位模式或PAE(物理地址扩展),它提供了一种方法来处理32-以上超过4GB的物理空间位模式。 [还有PSE-36 {页面大小扩展},但这种使用情况要少得多。]
您上面显示的地图特定于物理地址空间。 x86虚拟地址空间(当处理器以32位模式运行时)的大小为4GB,但它没有图中的所有保留区域。实际上,虚拟地址空间的布局完全取决于操作系统并由操作系统确定。在Linux中配置的通常的方式将虚拟地址空间的一部分保留在用户模式的3GB线以下,并且内核模式的区域大于3GB。但是,可以通过内核配置更改此配置。
物理地址空间到虚拟地址空间的映射由操作系统内核逐页管理。虚拟页面可以指向系统RAM或PCI设备。请注意,页面大小也会有所不同,具体取决于处理器和页表的配置方式。