重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
从按下PC的电源按钮开始,BIOS就接管系统控制权开始工作,它会先进行一些内存和设备的初始化工作(当然,也包括PCI设备),由于商业上的原因,Phoenix等厂商的BIOS代码需要授权协议,下面以另外一款开源BIOS(openbios)为例,来剖析BIOS中,PCIe设备是如何被找到以及初始化的。
为江门等地区用户提供了全套网页设计制作服务,及江门网站建设行业解决方案。主营业务为成都网站建设、网站建设、江门网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!PCI设备的扫描是基于深度优先搜索算法(DFS:Depth First Search),也就是说,下级分支最多的PCI桥将最先完成其子设备的扫描。下面以图片来具体说明,BIOS是如何一步步完成PCI 设备扫描的。
第一步:PCI Host 主桥扫描Bus 0上的设备(在一个处理器系统中,一般将与HOST主桥直接相连的PCI总线被命名为PCI Bus 0),系统首先会忽略Bus 0上的D1,D2等不会挂接PCI桥的设备,主桥发现Bridge 1后,将Bridge1下面的PCI Bus定为 Bus 1,系统将初始化Bridge 1的配置空间,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成0和1,以表明Bridge1的上游总线是0,下游总线是1,由于还无法确定Bridge1下挂载设备的具体情况,系统先暂时将Subordinate Bus Number设为0xFF。如图 1.1所示:
图 1.1 PCIE扫描第一步
第二步:系统开始扫描Bus 1,将会发现Bridge 2。系统将Bridge 2下面的PCI Bus定为Bus 2,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成1和2,和上一步一样暂时把Bridge 2的Subordinate Bus Number设为0xFF。如图 1.2所示:
图 1.2 PCIE扫描第二步
第三步:
系统继续扫描Bus 2,将会发现Bridge 4。系统将Bridge 4下面的PCI Bus定为Bus 3,并将该桥的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成2和3,此后
系统继续扫描后发现Bus 3下面已经没有任何Bridge了,意味着该PCI总线下已经没有任何挂载下游总线了,因此Bridge 4的Subordinate Bus Number的值已经可以确定为3了。
如图 1.3所示:
图 1.3 PCIE扫描第三步
第四步:
完成Bus 3的扫描后,系统返回到Bus 2继续扫描,发现Bus 2下面已经没有其他Bridge了。此时Bridge 2的Subordinate Bus Number的值也已经可以确定为3了。如图 1.4所示:
图 1.4 PCIE扫描第四步
第五步:
完成Bus 2的扫描后,系统返回到Bus1继续扫描,会发现Bridge 3,系统将Bridge 3下面的PCI Bus定为Bus 4。并将Bridge 4的Primary Bus Number 和 Secondary Bus Number寄存器分别设置成1和4,此后系统继续扫描后发现Bus 4下面已经没有任何Bridge了,意味着该PCI总线下已经没有挂载任何下游总线了,因此Bridge 3的Subordinate Bus Number的值已经可以确定为4了。如图 1.5所示:
图 1.5 PCIE扫描第五步
第六步:
完成Bus 4的扫描后,系统返回到Bus 1继续扫描, 发现Bus 1下面已经没有其他Bridge了。此时Bridge 1的Subordinate Bus Number的值已经可以确定为4,系统返回Bus 0继续扫描(Bus 0下如果有其他它Bridge,将重复上述的步骤进行扫描)。至此,本例中的整个PCI的设备扫描已经完成了。最终的设备和总线的扫描结果如图 1.6所示
图 1.6 PCIE扫描第六步
一般来说,可以通过两个寄存器来访问PCI的配置空间(寄存器CONFIG_ADDRESS与CONFIG_DATA),在x86体系下,这两个寄存器分别对应0xCF8和0xCFC端口,对配置空间的访问都是通过对这两个寄存器的读写来实现先。CONFIG_ADDRESS寄存器的具体位组成如图 1.7所示:
图 1.7 x86配置寄存器
Bus Number : 总线号(8 bit),范围0--255。
Device Number: 设备号(5 bit),范围0--31。
Function Number: 功能号(3 bit),范围0--7。
Register Number: 寄存器号(6 bit),范围0--63(配置空间一共256个字节,分割成64个4字节的寄存器,从0--63编号)。
每个PCI设备可根据上图所示的四个信息:Bus Number, Device Number, Function Number,Register Number来进行具体设备的定位并对其配置空间访问。当访问PCI设备的配置空间时,先根据以上格式设置CONFIG_ADDRESS寄存器,然后再读取CONFIG_DATA寄存器即可得到相应的配置空间寄存器的值。通过以上这些步骤,BIOS就完成了所有PCI设备的扫描,并且为每个设备分配好了系统资源。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。