系统操作和维护
1.PCIE扫描流程
从按下PC的电源按钮开始,BIOS将接管对系统的控制并开始工作。它将首先初始化一些内存和设备(当然包括PCI设备)。由于商业原因,凤凰等厂商的BIOS代码需要一个授权协议。下面我们以另一个开源BIOS(openbios)为例,分析一下PCIe设备是如何在BIOS中被发现并初始化的。
PCI设备的扫描是基于DFS:深度优先搜索),即具有最下级分支的PCI桥将首先完成其子设备的扫描。这里有一张图来说明BIOS是如何一步一步完成PCI设备扫描的。
第一步:PCI主机的主桥扫描总线0上的设备(在一个处理器系统中,与主桥直接相连的PCI总线一般命名为PCI总线0)。首先,系统会忽略总线0上的设备,如D1和D2,它们不会与PCI桥连接。在主桥发现桥1之后,它将把桥1下面的PCI总线指定为总线1。系统将初始化桥1的配置空间,并将桥的一级总线号和二级总线号寄存器分别设置为0和1,以指示桥1的上游总线为0,下游总线为1。由于无法确定Bridge1下挂载设备的具体情况,系统会暂时将从属总线号设置为0xFF。如图1.1所示:
图1.1 PCIe扫描的第一步
步骤2:系统开始扫描总线1,并将找到桥2。系统将2号桥下的PCI总线设置为2号总线,并将该桥的一级总线号和二级总线号寄存器分别设置为1和2,并将2号桥的二级总线号临时设置为0xFF。如图1.2所示:
图1.2 PCIE扫描步骤2
第三步:
系统将继续扫描总线2,并将找到桥4。系统将桥4下的PCI总线设置为总线3,并将桥的一级总线号和二级总线号寄存器分别设置为2和3。在那之后,
系统继续扫描后,发现总线3下没有桥,说明PCI总线下没有下游总线,所以可以确定4桥的从属总线号的值为3。
如图1.3所示:
图1.3 PCIe扫描的第三步
第四步:
完成对总线3的扫描后,系统返回到总线2继续扫描,发现总线2下没有其他桥。此时,桥2的从属总线号的值也可以确定为3。如图1.4所示:
图1.4 PCIe扫描的第四步
第五步:
完成对总线2的扫描后,系统返回到总线1继续扫描,会找到桥3,桥3下的PCI总线会被指定为总线4。并将桥4的主总线号和次总线号寄存器分别设置为1和4。系统继续扫描后,发现总线4下没有桥,说明PCI总线下没有挂载下游总线,因此可以确定桥3的从属总线号的值为4。如图1.5所示:
图1.5 PCIE扫描步骤5
第六步:
在完成对总线4的扫描后,系统返回到总线1继续扫描,并发现总线1下没有其他桥。此时可以确定桥1的下属总线号的值为4,系统返回到总线0继续扫描(如果总线0下还有其他桥,重复上述步骤进行扫描)。至此,本例中整个PCI的设备扫描已经完成。最终的设备和总线扫描结果如图1.6所示。
图1.6 PCIe扫描的第六步
一般来说,PCI配置空间(寄存器CONFIG_ADDRESS和CONFIG_DATA)可以通过两个寄存器访问。在x86架构下,这两个寄存器分别对应0xCF8和0xCFC端口,通过读写这两个寄存器实现对配置空间的访问。CONFIG_ADDRESS寄存器的具体位组成如图1.7所示:
图1.7 x86配置寄存器
总线号:总线号(8位),范围0255。
设备号:0-31范围内的设备号(5位)。
功能号:0-7范围内的功能号(3位)。
寄存器号:寄存器号(6位),范围0-63(配置空间共256字节,分为64个4字节寄存器,编号为0-63)。
每个PCI设备都可以根据上图所示的四个信息:总线号、设备号、功能号、寄存器号来定位具体的设备并访问其配置空间。在访问PCI设备的配置空间时,首先按照上述格式设置CONFIG_ADDRESS寄存器,然后读取CONFIG_DATA寄存器,得到对应的配置空间寄存器的值。通过以上步骤,BIOS已经完成了对所有PCI设备的扫描,并为每个设备分配了系统资源。
更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理官网:www.chenqinet.cn。