配置空间访问流程
为了总结,我们就从CPU出发,用对配置空间的读请求做一个例子,来对整体的流程来一个总结吧!
- 首先,CPU执行内存访问指令来读取虚拟内存中映射的,在ECAM中的,某个配置空间的内容。比如:mov ax, [0x10e8100000]。
- 然后,这个读请求的地址经过MMU,查询页表得到物理内存的地址。假设,这个物理地址是BDF为 81:00.0 的设备的配置空间地址:0xe8100000。
- 这个读请求会被发送给Memory Controller,Memory Controller检查这个地址之后,发现这个地址不属于DRAM,于是转发给对应的PCIE控制器,到Root Complex中。
- Root Complex的Host Bridge收到这个请求,发现这个请求属于设备的配置空间,于是将这个请求转换为一个配置空间的读请求(请求名称叫CfgR0,具体的结构后面会介绍),地址是BDF 81:00.0,Offset是0,长度是2个字节,并利用BDF开始路由。
- Root Complex根据所有连接到其上面的设备和桥的配置空间里的配置,将这个请求转发给对应的设备。如果是设备本身就检查Device Number和Function Number,如果是桥,就检查Secondary Bus Number和Subordinate Bus Number,然后进行递归的转发。
- 最后,请求到达设备。 数据返回的流程和请求的流程非常类似,只不过是从设备出发,返回给CPU,这里就不再赘述了。