我知道PCI和PCIe设备可以由CPU(通过BIOS或OS中的代码)配置,通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐,DMA功能等),Linux内核有相当复杂的算法。
看到该软件似乎控制了这个内存映射的时间,地点和位置,我的问题是:一块软件如何控制物理内存的映射?
在此配置之后,PCI设备将知道响应给定的地址范围,但是CPU如何知道它应该在PCI总线上用于那些刚刚动态决定的特定地址?
答案 0 :(得分:3)
使用要路由到存储器控制器的地址范围对北桥进行编程。 所有其他地址都转到外部总线。
答案 1 :(得分:1)
它基于CPU拥有的地址映射信息。 通常,如果是64位处理器,则具有2 ^ 64 -1条地址线和CPU。 现在内存现在约为16 GB,即2 ^ 34约为16 GB。 因此,可以映射CPU拥有的所有设备(甚至是旧式PCI和PCIe设备)及其配置空间 到此RAM物理地址空间上方的地址线。 该空间的任何IO都可以转发到相应的设备。 在我们的案例中,CPU发现它要访问的配置空间是PCI或PCIe设备,然后转发 有关CPU主机桥的说明(00:00:00在框中输入lspci,您将看到带有此BDF的主机桥)
一旦发现目标设备在主机桥接器内,指令(可以是IO或内存)将被转换为适当的TLP请求。