硬件总线基础05:PCI总线基础(2)

说在开头:关于我的世界(1)

我们通过眼、耳、舌、鼻、身、意来感知这个世界,那么我们所感知到的这个世界是真实存在的么?假如我们不否认所感知到世界的真实性,但我们能确定自己感知到了这个世界的“本来面目”么?世界的本质是什么,是如我们白天所见的五光十色,夜晚所感的寂静沉默?释迦摩尼打坐菩提树下,仰望璀璨星空而悟道成为佛陀:缘起性空!那么我们所信仰的科学又能得到怎样的结论呢。

正如之前所说的,科学是要求能够检验的,同时这个“检验”也要经得起检验:通过公开的实验步骤,能够被他人独立做出同样的结果。但是并非所有东西都能够被检测到,它需要同我们的感官或仪器起作用才行(就如那条被我们多次提起的“隐形喷火巨龙”,我们感知不到,就无法检验它是否存在,所以我们不能否认它的存在,只是认为这条“隐形的喷火巨龙”是无意义的。)。那么我们能够感知到什么呢?还记得开篇第一章的的东西么:宇宙大爆炸和四大基本力。

我们首先所能感知的便是电磁力,咱们这群人大多是跟电打交道的,对电磁力的理解比普通人要深一点点(我所分享的所有硬件相关基础内容,都可以归为电磁力范畴),同时我们平时生活中也到处是电磁力,包括我们最重要的感官器官-眼睛,它所能感知的光(可见光)只是电磁波频谱中很狭窄的一个频段(400nm~760nm),而我们之所以能看到这个频段,是因为太阳的电磁波辐射中的该频段能量最强,所以人类进化出了可以感知到该频段的感知器官,那么超出我们感知(六感)范围之外的事物是什么样的呢?对于其它频段的电磁波,即使充满着你所处的空间:手机的3G/4G/5G频段,Wi-Fi,蓝牙,红外等等,但我们依然也无法感知。虽然人类眼睛无法感知到可见光之外的电磁波,但是我们的仪器却可以捕获这些电磁波信号,我们通过它可以观测小至电子的跃迁,大到宇宙百亿光年深处星系(韦伯红外线太空望远镜);这些仪器是人类眼睛的延展,是探索宇宙奥秘的最大利器。

而对其它力(引力、弱核力和强核力)的测量就没有那么容易了,我们要对它们进行精确的测量,必须转换成电磁力。对于更加神秘的暗物质和暗能量,科学家们只是从对现有宇宙观测以及宇宙模型的分析中推测出来存在这两种神秘“物质”,而由于其不能与电磁力直接发生作用,所以一直没有被证实而处于理论假设阶段,至于我们是否能探测到“暗物质和暗能量”都不是很好下定论的事,更不要说我们去深入了解它。

我们对暗物质和暗能量或许还是有所期待(有许许多多的暗物质模型猜测,就可以通过所猜测的物质的性质:例如轴子是暗物质的其中一个候选,而轴子-核子具有相互作用;那么可以通过这种相互作用来探测暗物质),世界上很多国家在天上(太空)地下(几千米的地底)建立探测实验室,探测这种位置的物质。但是根据量子论的不确定性原理,量子级别的物质(电子)本身就存在不确定性,我们的观测就只能到这个级别了,上帝在这个级别上给我们竖立了一道几乎不可逾越的屏障。那么从科学角度来看世界的本质是什么?是一根根的弦么?平行宇宙?抑或多重泡泡宇宙?还是二进制的代码(黑客帝国)?这些都无法从科学这里得到一个明确的结论。

或许正如玻尔所说,对于世界只有观测才是有意义的。你一定要去管他世界的实在做什么?你这次观测到了是波它就是波,下次观测到了是粒子它就是粒子,至于它到底是什么?你也管不了,也不该管!

二,PCI读写总线协议

对于任何总线来说,其基本任务是实现数据的传输;而将一组数据从一个设备可靠的传输到另外一个/多个设备需要一定的规则,而这个规则就是总线协议

PCI总线有两种数据传输方式:

1. 地址译码方式实现数据传输:采用地址信号;

——当PCI设备配置空间被初始化后,该设备再当前的PCI总线树上有一个独立的PCI总线地址空间(保存在BAR寄存器上的空间)。

1,处理器与PCI设备以及PCI设备之间的数据交换,是通过PCI总线地址完成;

2,PCI设备与主存储器之间的DAM操作,使用的也是PCI总线域地址。

——HOST主桥实现PCI总线地址到存储器域地址的转换。

2. ID译码方式进行配置信息传输:采用PCI设备ID号,包括Bus Number、Device Number、Function Number和Register Number。

——PCI总线配置读写总线事务是HOST处理器对PCI设备的BAR空间进行数据读写。

——总线上的每个设备(device)最多可以包含8个function,这些功能都共享该设备的总线接口,编号为0到7。

1,Posted和Non-Posted传输方式

PCI总线规定了两类数据传输方式:Posted和Non-Posted数据传输方式;这两种数据传输方式也被借鉴到了eSPI总线协议。如之前所述,我们可以将Posted传输方式比作是寄快递,当我们将快递交给了快递员,那么我就可以自行做其它事情了,而不需要时刻关注这这个快递的传递情况;而Non-Posted传输方式则表示自己亲自去送快递,直到对方收到快递并确定快递盒里的东西是正确的,才结束工作

1. Posted总线事务指PCI主设备向PCI目标设备进行数据传输时,当数据到达PCI桥后,即由PCI桥接管来自上游总线事务,并将其转发到下游总线;

——Posted总线事务在数据还没到达最终目的地之前,PCI总线就可以结束当前的总线事务,从而在一定程度上解决了PCI总线的拥塞问题。

——PCI总线规定只有存储器写请求可以采用Posted总线事务(PMWPosted Memory Write),而存储器读请求、I/O读写请求、配置读写请求只能采用Non-Posted总线事务

2. Non-Posted总线事务指PCI主设备向PCI目标设备进行数据传输时,数据必须到达最终目的地之后,才能结束总线事务。

2,HOST处理器访问PCI设备

HOST处理器访问PCI设备包含两部分的内容:1,处理器向PCI设备发起存储器和I/O读写请求;2,处理器对PCI设备进行配置读写。

在PCI设备的配置空间中有6个BAR寄存器,其中每个BAR寄存器都与PCI设备使用的一组PCI总线地址相对应,而BAR寄存器记录这组地址空间的基地址(PCI设备的地址空间用:基地址+地址空间大小两部分组成);需要强调的是BAR寄存器中存放的地址是“PCI总线域地址”而非“存储域地址”。

存储器读写事务需要将PCI设备使用的BAR空间映射到“存储器域”的存储器地址空间,然后处理器通过存储器读写指令访问“存储器域”的存储器地址空间,再后HOST主桥将“存储器域”的读写请求转换为PCI总线的存储器读写总线事务,最后发送给目标设备。举个栗子:如下图所示,通过HOST主桥和PCI桥1对PCI设备11进行存储器读写操作,具体写操作步骤如下:

1. 处理器将要发送的数据放入通用寄存器中,然后向PCI设备11映射到的存储器域的地址进行写操作;

——注意:处理器并不能直接访问到PCI设备11的PCI总线域地址空间。

2. HOST主桥x接收到来自处理器的存储器写请求后,处理器结束当前存储器写操作,释放系统总线;然后HOST主桥x将存储器域地址转换为PCI总线域的PCI总线地址,并向PCI总线x0发起PCI写请求总线事务;

3. PCI总线x0上的PCI设备01/02和PCI桥1将同时监听到该PCI写总线事务,然后PCI桥1接收了这个总线事务,并结束来自PCI总线x0的PCI总线事务;

4. PCI总线x1上的PCI设备11/12同时监听该PCI写总线事务,最后PCI设备11通过地址译码方式接收该写总线事务,并结束来自PCI总线x1上的PCI总线事务。

处理器对PCI设备11进行存储器读操作时,该请求通过HOST主桥x和PCI桥x1到达PCI设备,之后PCI设备将读取的数据再次通过PCI桥x1和HOST主桥x传输给HOST处理器,具体读操作步骤如下:

1. 处理器准备接收数据使用的通用寄存器,然后向PCI设备11映射到的存储器域的地址进行读操作;

2. HOST主桥x接收来自处理器的存储器读请求,HOST主桥x进行存储器地址到PCI总线地址的转换,之后向PCI总线x0发起存储器读总线事务;

3. PCI总线x0上的PCI设备01/02和PCI桥x1将监听该存储器读请求,之后PCI桥1接收该存储器读请求,并向PCI总线x1发起新的PCI总线读请求;

4. PCI总线x1上的PCI设备11/12监听该PCI读请求总线事务,最后PCI设备11接收该存储器读请求总线事务,并将该读请求总线事务转换为存储器读完整总线事务,并将数据发送到PCI桥x1,并结束来自PCI总线x1上的PCI总线事务;

5. PCI桥x1将接收到的数据通过PCI总线x0,继续上传到HOST主桥x,并结束PCI总线x0上的PCI总线事务;

6. HOST主桥x将数据传递给处理器,最终结束处理器的存储器读操作。

3,PCI设备读写主存储器(DMA)

PCI设备与存储器直接进行数据交换的过程称之为DMA(Direct Memory Access),PCI设备进行DMA操作时,需要获得数据传输的目的地址和传输大小;所以支持DMA操作的PCI设备BAR空间设置两个寄存器,分别保存目标地址和传输大小。

——PCI设备进行DMA操作时,使用的目的地址是PCI总线域的地址,而非存储器域地址,因为PCI设备不能直接识别存储器域的地址(需HOST主桥映射/转换),且只有在PCI总线域中有映射的存储器空间才能被PCI设备访问。

如下以PCI设备11向主存储器写数据为例,说明PCI设备如何进行DMA写操作:

1. PCI设备11将存储器的写请求发现PCI总线x1;

2. PCI总线x1上所有设备监听该请求,只有PCI桥x1接收了该数据请求,并结束来自PCI设备11的Posted存储器写请求,将该数据请求推到上游PCI总线x0上;

3. PCI总线x0上的所有PCI设备包括HOST主桥将监听该请求,而该数据只能由HOST主桥x接收,并结束PCI桥x1的Posted存储器写请求;

4. HOST主桥x发现这个数据请求发现存储器,将来自PCI总线x0的PCI总线地址转换为存储器地址,再通过存储器控制器将数据写入存储器,完成PCI设备的DMA写操作。

PCI设备进行DMA读过程与DMA写过程类似,只是PCI总线存储器读总线事务只能使用Non-Posted总线事务。当处理器用Non-Posted总线事务对PCI设备进行读操作(或PCI设备进行存储器读操作),当数据还未到达目的地,那么该读操作路径上所有的PCI总线都不能被释放,这严重影响了PCI总线的传输效率。为此PCI桥对Non-Posted总线事务进行优化,使用Delayed总线事务处理这些Non-Posted总线事务,Delayed总线事务在一定程度上提高了PCI总线的利用率,可以Non-Posted请求通过PCI桥后,可以暂时释放PCI总线,但这种方式会让HOST/PCI桥不断进行重试(Retry)操作,所以并不能取得理想的效果(重试(Retry)操作也大量消耗PCI总线的带宽);所以为了进一步提升Non-Posted的PCI总线事务执行效率,PCI-X总线将PCI总线使用的Delayed总线事务,升级为Split总线事务,可以有效解决HOST/PCI桥的这些重试操作。Split总线事务的基本原理是:发送端首先将Non-Posted总线请求发送给接收端,然后由接收端主动地将数据传输给发送端

4,PCI设备和PCI桥的配置空间

PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间;规范中固定了三种类型的PCI配置空间:

1. PCI Agent 设备使用的配置空间;

2. PCI桥使用的配置空间;

3. CardBus桥片使用的配置空间。

PCI定义了两类配置请求,用于访问PCI总线树上的设备配置空间,包括PCI桥和PCI Agent设备:

1. Type 00h配置请求:HOST主桥或PCI桥使用该配置请求,访问与HOST主桥或PCI桥直接连接的PCI Agent设备或PCI桥;

2. Type 01h配置请求:HOST主桥或PCI桥使用该配置请求,需要至少穿越1个PCI桥来访问没有直接连接关系的PCI Agent设备或PCI桥。

——只有PCI桥才能接收Type 01h配置请求,且不能直接发向最终的PCI Agent设备;只能由PCI桥将其转换为Type 01h继续发向其它PCI桥或则转换为Type 00h配置请求发向PCI Agent设备

4.1 PCI Agent设备配置空间

PCI Agent设备通常将PCI配置信息放在EEPROM中,当PCI设备上电初始化时,将EEPROM中的信息读取到PCI设备的配置空间中作为初值。然后系统软件使用CONFIG_ADDR和CONFIG_DATA寄存器,读取PCI设备配置空间的初始化信息,根据处理器系统的实际情况DFS算法,初始化处理器系统汇总所有的PCI配置空间(256B)。

——这些值,部分是PCI设备本身的信息,举个栗子:它需要多大的Memory或则I/O的地址空间,HOST处理器获得PCI Agent设备的这些信息后就能给它分配响应的地址空间。

——DFS:Depth First search(深度优先查找)算法;这是PCI总线初始化的一种算法,从总线的一个节点开始,不断深入下层节点(以深度优先),然后遍历整条PCI总线树的方法;下面章节详细介绍。

PCI Agent设备的配置空间中包含了许多寄存器,如下图所示;在PCIe配置寄存器中将完全集成PCI的这部分内容。具体定义如下。

1. Device ID和Vendor ID寄存器,只读寄存器,这两个寄存器的值由PCISIG分配;

1,Vendor ID:代表PCI设备的生产厂商;

——举个栗子:0x8086表示生产厂商为Intel;当Vendor ID为0xFFFF时表示无效。

2,Device ID:代表该厂商所生产的具体设备。

2. Revision ID和Class Code寄存器,同样是只读寄存器;

1,Revision ID:记载了PCI设备的版本号,可认为是Device ID寄存器的扩展;

2,Class Code:记载了PCI设备的分类;由三段组成:Base Class Code,Sub Class Code 和Intercase。

——其中Base Class Code将PCI设备分类为:显卡,网卡和PCI桥等设备;而Sub Class Code对这些设备进行了再细分;Interface定义了编程接口。

3. Header Type寄存器,只读寄存器,由8bit组成;

1,bit7:1表示当前PCI设备是多功能(Function)设备,0表示为单功能(Function)设备;

2,bit6~bit0:表示当前配置空间的类型;0表示PCI Agent设备的空间(普通PCI设备),1表示PCI桥配置的空间,2表示CardBus桥的配置空间。

4. Card Line Size寄存器,记录HOST处理器使用的Cache行长度;PCI设备的硬件逻辑需要知道处理器系统的Cache行的大小,才能进行存储器写并无效总线事务;

——如果PCI设备不支持Cache相关总线事务,系统软件可以不设置该寄存器,默认:0x00。

5. Subsystem ID和Subsystem Vendor ID寄存器,与Device ID和Vendor ID类似,也记录PCI设备的生产厂商和设备名称,但又略有不同;

6. Expansion ROM base address寄存器,有些PCI设备在处理器还未运行操作系统之前,需要完成基本的初始化设置(举个栗子:键盘、硬盘、显卡等等),为了实现“预先执行”功能,PCI设备需要提供一段ROM程序,而处理器在初始化过程中将运行这段ROM程序对PCI设备进行初始化;Expansion ROM base address中记载了这段ROM程序的基地址;

7. Capabilities Pointer寄存器,可选寄存器,但在PCIe设备中必须支持该寄存器;其存放了Capabilities寄存器组的基地址;PCI设备使用Capabilities寄存器组存放一些PCI设备相关的扩展配置信息;(在PCIe寄存器章节中详细介绍)

8. Interrupt Line寄存器,是系统软件对PCI设备进行配置时写入的,记录当前PCI设备使用的中断向量号,设备驱动程序可以通过该寄存器判断当前PCI设备使用处理器系统中的哪个中断向量号,并驱动程序进入中断服务;

9. Interrupt Pin寄存器,该寄存器保存了PCI设备使用的中断管脚;INTA#/B#/C#/D#,Interrupt Pin寄存器位1时表示使用INTA#向中断控制器提交中断请求;2表示使用INTB#,3表示使用INTC#,4表示使用INTD#;

10. Base Address Register,简称BAR寄存器,保存PCI设备使用的地址空间的基地址,该基地址是PCI总线域的地址;每一个PCI设备支持最多6个基地址空间(32bit),如果是64bit地址则是3个基地址空间;

——系统软件对PCI总线进行配置是,首先需要获得BAR寄存器中的初始化信息,之后根据处理器系统的配置写入合理的基地址到BAR寄存器中。

11. Command寄存器,该寄存器为PCI设备的命令寄存器;在初始化时值为0,此时PCI设备只能接收配置请求的总线事务,不能接收任何存储器或I/O请求;在系统软件设置完该寄存器后,才能访问该设备的存储器(Memory)或I/O空间;具体如下所示。

1,Bit0,I/O Space,表示PCI设备是否响应I/O请求,1表示响应,0表示不响应;

2,Bit1,Memory Space,表示PCI设备是否响应存储器请求,1表示响应,0表示不响应;

3,Bit2,Bus Master位,表示PCI设备是否可以作为主设备,1表示可以,0表示不能;

4,Bit3,Special Cycle位,表示PCI设备是否响应Special总线事务,1表示响应,0表示不响应;

5,Bit4,Memory Write and Invalidate位,表示PCI设备是否支持Memory Write and Invalidate总线事务,1表示支持,0表示不支持;

6,Bit5,VGA Palette Snoop位,1表示支持Palette snoop功能,0表示不支持;

7,Bit6,Parity Error Response位,该位为1时:PCI设备在传输构成中出现奇偶校验错误时,PCI设备将PERR#信号设置为1;该位为0时:即便出现奇偶校验出错,只会将Status寄存器的“Detected Parity Error”位置1;

8,Bit8,SERR# Enable位,该位为1时:PCI设备出错时,将使用SERR#信号将该错误信息发给HOST主桥;该位为0时:不能使用SERR#信号;

9,Bit9,Fast Back-to-Back位,该位为1时:PCI设备使用Fast Back-to-Back(快速背靠背)总线周期,提升传输效率;

10,Bit10,Interrupt Disable位,该位为1时:PCI设备不能通过INTx信号向HOST主桥提交中断请求,该位为0时:可以使用INTx信号提交中断请求。

12. Status寄存器,该寄存器绝大多数位都是只读的,保存了PCI设备的状态。

1,Bit3,Interrupt Status,只读寄存器;该位为1且Command寄存器的Interrupt Disable位为0时:表示PCI设备已经使用INTx信号向处理器提交了中断请求;

2,Bit4,Capabilities List,只读寄存器;该位为1时:Capability Pointer 寄存器的值有效;

3,Bit5,66MHz Capaility,只读寄存器;表示此设备支持66MHz的PCI总线;

4,Bit7,Fast Back-to-Back Capable,只读寄存器;该位为1时表示此设备支持快速背靠背总线周期;

5,Bit8,Master Data Parity Error,只读寄存器;PCI总线PERR#信号有效时置位1;

6,Bit9~10,DEVSEL timing,只读寄存器;0xb00时表示PCI设备为快速设备;为0xb01时表示PCI设备未中速设备;

7,Bit11,Signaled Target Abort;该位由PCI目标设备设置,当目标设备使用目标设备Target Abort,结束当前总线周期时,PCI设备将置位该位为1。

13. Latency Timer寄存器,PCI总线中多个设备共享一条总线带宽,该寄存器用于控制PCI设备占用PCI总线的时间,PCI设备获得总线使用权,并使能Frame#信号后,Latency Timer寄存器将递减,当寄存器归零后,该设备将使用超市机制停止对当前总线的使用。

PCIe总线配置空间从PCI的256B扩展到了4KB,其中PCI总线配置空间的256B是全部保留并兼容的,但是有一些寄存器在PCIe总线中已经弃用,我们不做这些寄存器的扩展介绍。

4.2 PCI 桥配置空间

PCI桥的配置空间与PCI Agent设备配置空间有很多是相同的,但也有很多不同的地方;1,PCI桥只含有两组BAR寄存器,是可选的,如果PCI桥不存在私有寄存器,那么可以不使用BAR寄存器;2,管理齐下PCI总线子树(Secondary Bus)使用各类资源:包括存储器、I/O地址空间和总线号。

——大多数PCI桥不存在私有寄存器,操作系统也不需要提供PCI桥的驱动程序,所以这类桥被称为透明桥

——Secondary Bus相关寄存器分为两大类:1,寄存器管理Secondary BusPCI子树的总线号寄存器;2,寄存器管理下游PCI总线的I/O和寄存器地址空间

1. Subordinate Bus Number、Secondary Bus Number和Primary Bus Number寄存器;

——这三个寄存器在初始化时必须为0,系统软件根据这几个寄存器是否为0,判断PCI桥是否被配置过。

1,Subordinate Bus Number寄存器:存放当前PCI子树中变好最大的PCI总线号;

2,Secondary Bus Number寄存器:存放当前PCI桥Secondary Bus使用的总线号,该号是PCI桥管理的PCI子树中变好最小的PCI总线号;

——PCI桥管理的PCI总线号在Subordinate Bus NumberSecondary Bus Number之间

3,Primary Bus Number寄存器:存放该PCI桥上游的PCI总线号,该寄存器可读写。

2. Secondary Status寄存器,该寄存器含义与PCI Agent中的Status寄存器类似,但是PCI桥中的Status寄存器记录的是Secondary Bus的状态,而非PCI设备的使用状态;

——在PCI桥配置空间中存在另外一个Status寄存器,存放的是PCI桥设备本身的状态。

3. Secondary Latency Timer寄存器,与PCI Agent配置空间的Latency Timer类似,但该寄存器管理的是Secondary Bus的超时机制;

4. I/O Limit和I/O Base寄存器,在PCI桥管理的PCI子树中包含许多PCI设备,并使用很多I/O地址空间;PCI桥的这两个寄存器存放PCI子树中所有设备使用I/O地址空间的集合;

5. Memory Limit和Memory Base寄存器,同理,这两个寄存器存放了PCI总线子树下所有PCI设备使用的存储器地址空间集合的基地址和大小(至少为1MB);

6. Bridge Control Register,该寄存器用来管理PCI桥的Secondary Bus:

1,Bit6,Secondary Bus Reset,当该位为1时:使用下游总线提供的RST#信号复位与PCI桥的下游总线连接的PCI设备;

2,Bit8,Primary Discard Timer,PCI桥支持Delay传送方式;

3,Bit9,Secondary Discard Timer,当该位为1时:表示在Secondary Bus上的主设备需要在2¹⁰个四种周期之内重试这个数据请求;当该位为0时:表示主设备需要在2¹⁵个四种周期之内重试这个数据请求;若在规定时间内没有重试,PCI桥将丢弃Delayed数据请求。

4.3 PCI 总线树Bus号初始化

在处理器系统中,每一个HOST主桥对管理着一颗PCI总线树,而在一颗PCI总线树下又有多个PCI桥(多个PCI总线);软件在遍历当前PCI总线树时,需要首先对这些PCI总线进行编号:Subordinate Bus Number、Secondary Bus Number和Primary Bus Number。一般HOST主桥直接相连的PCI总线号为0,然后DFS(Depth First Search)算法对PCI总线进行编号。

——软件有两种常用的遍历算法:DFS和BFS(Breadth First Search,广度优先);相比较DFS算法更加简单。

1. HOST主桥扫描PCI总线0上的设备,忽略所有的PCI Agent设备(因为这些设备是终结,其下方不会有PCI总线),而查找PCI桥;

2. HOST主桥首先发现PCI桥1,并将PCI桥1的Secondary Bus命名为PCI总线1;

——软件初始化PCI桥1的配置空间,将PCI桥1的Primary Bus Number寄存器赋值为0,而Secondary Bus Number寄存器赋值为1;即PCI桥1的上下游总线号分别为:0和1。

3. 扫描PCI总线1发现PCI桥2,并将PCI桥2的Secondary Bus命名为PCI总线2;

——软件初始化PCI桥2的配置空间,将PCI桥2的Primary Bus Number寄存器赋值为1,而Secondary Bus Number寄存器赋值为2;即PCI桥1的上下游总线号分别为:1和2。

4. 扫描PCI总线2发现PCI桥3,并将PCI桥3的Secondary Bus命名为PCI总线3;

——软件初始化PCI桥3的配置空间,将PCI桥3的Primary Bus Number寄存器赋值为2,而Secondary Bus Number寄存器赋值为3;即PCI桥1的上下游总线号分别为:2和3。

5. 扫描PCI总线3没有发现PCI桥,表示PCI总线3下没有新的总线;

——此时软件将PCI桥3的Subordinate Bus Number寄存器赋值为3,完成扫描后开始继续扫描PCI总线2。

6. 如此往复,将PCI桥1下的总线全都扫描一遍,最终回退到PCI总线0,并将PCI桥1的Subordinate Bus Number寄存器赋值为3;同时在PCI总线0上继续扫描其它PCI桥;

7. 最终结束整个PCI总线的DFS遍历,得到HOST主桥下所有PCI总线树结构。

我们现在可以清晰的理解到,DFS算法是从深度优先来扫描PCI总线树。

写在最后

PCI总线协议本身的内容非常复杂,本章是关于PCI总线的基础概念,我已经有10多年没看到哪个CPU上还有出PCI总线接口,所以对于PCI总线的技术细节并不需要深入了解;而我们了解PCI总线基本概念是为了接下来更好地理解PCIe总线。

本章部分相关内容和图片参考自:王齐 -《PCI Express 体系结构导读》,Mike Jackson-《PCI Express Technology 3.0》,知乎- LogicJitterGibbs《译文:PCI Express Technology 3.0》。下一章《PCIe总线基础》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值