如果PCI设备访问的地址在某个CPU的Cache行中命中时,可能会出现三种情况。Cache行状态为S时的处理情况与状态为E时的处理情况大同小异,PCI设备在进行写操作时也将数据直接写入主存储器,并使无效状态为S的Cache行。此时CPU对FSB总线监听时,不能简单将当前Cache行使无效,因为这个使无效操作将丢失阴影部分的有效数据。随后CPU将状态位为M的Cache行与存储器进行同步后,再使无效这个Cache行。......
2023-10-20
下面以图3-2所示的处理器系统为例,说明PCI设备11向存储器进行DMA写的数据传送过程。PCI设备的DMA写使用Posted方式而DMA读使用Non-Posted方式。本节不介绍PCI设备进行DMA读的过程,而将这部分内容留给读者分析。
假定PCI设备11需要将一组数据发送到0x1000-0000~0x1000-FFFF这段存储器域的地址空间中。由上文所述,存储器域的0x0000-0000~0x7FFF-FFFF这段存储器空间与PCI总线域的0x8000-0000~0xFFFF-FFFF这段PCI总线地址空间对应。
PCI设备11并不能直接操作0x1000-0000~0x1000-FFFF这段存储器域的地址空间,PCI设备11需要对PCI总线域的地址空间0x9000-0000~0x9000-FFFF进行写操作,因为PCI总线地址空间0x9000-0000~0x9000-FFFF已经被HOST主桥映射到0x1000-0000~0x1000-FFFF这段存储器域。这个DMA写具体的操作流程如下。
(1)首先PCI设备11通过总线仲裁逻辑获得PCI总线1的使用权,之后将存储器写总线事务发送到PCI总线1上。值得注意的是,这个存储器写总线事务的目的地址是PCI总线域的地址空间0x9000-0000~0x9000-FFFF,这个地址是主存储器在PCI总线域的地址映像。
(2)PCI总线1上的设备将进行地址译码,确定这个写请求是不是发送到自己的BAR空间,在PCI总线1上的设备除了PCI设备11之外,还有PCI桥2和PCI桥1。
(3)首先PCI桥1、2和PCI设备11对这个地址同时进行正向译码。PCI桥1发现这个PCI地址并不在自己管理的PCI总线地址范围之内,因为PCI桥片1所管理的PCI总线地址空间为0x7000-0000~0x73FF-FFFF。此时PCI桥1将接收这个存储器写总线事务,因为PCI桥1所管理的PCI总线地址范围并不包含当前存储器写总线事务的地址,所以其下所有PCI设备都不可能接收这个存储器写总线事务。
(4)PCI桥1发现自己并不能处理当前这个存储器写总线事务,则将这个存储器写总线事务转发到上游总线。PCI桥1首先通过总线仲裁逻辑获得PCI总线0的使用权后,然后将这个总线事务转发到PCI总线0。(www.chuimin.cn)
(5)HOST主桥发现0x9000-0000~0x9000-FFFF这段PCI总线地址空间与存储器域的存储器地址空间0x1000-0000~0x1000-FFFF对应,于是将这段PCI总线地址空间转换成为存储器域的存储器地址空间,并完成对这段存储器的写操作。
(6)存储器控制器将从HOST主桥接收数据,并将其写入到主存储器。
PCI设备间的数据传递与PCI设备到存储器的数据传送大体类似。我们以PCI设备11将数据传递到PCI设备42为例说明这个转递过程。我们假定PCI设备11将一组数据发送到PCI设备42的PCI总线地址0x7500-0000~0x7500-FFFF这段地址空间中。这个过程与PCI设备11将数据发送到存储器的第1~5步基本类似,只是第5、6步不同。PCI设备11将数据发送到PCI设备42的第5、6步如下所示。
(5)PCI总线0发现其下的设备PCI桥4能够处理来自PCI总线0的数据请求,则PCI桥4将接管这个PCI写请求,并通过总线仲裁逻辑获得PCI总线4的使用权,之后将这个存储器写请求发向PCI总线4。此时HOST主桥不会接收当前存储器写总线事务,因为0x7500-0000~0x7500-FFFF这段地址空间并不是HOST主桥管理的地址范围。
(6)PCI总线4的PCI设备42将接收这个存储器写请求,并完成这个PCI存储器写请求总线事务。
PCI总线树内的数据传送始终都在PCI总线域中进行,不存在不同域之间的地址转换,因此PCI设备11向PCI设备42进行数据传递时,并不会进行PCI总线地址空间到存储器地址空间的转换。
有关PCI Express体系结构导读的文章
如果PCI设备访问的地址在某个CPU的Cache行中命中时,可能会出现三种情况。Cache行状态为S时的处理情况与状态为E时的处理情况大同小异,PCI设备在进行写操作时也将数据直接写入主存储器,并使无效状态为S的Cache行。此时CPU对FSB总线监听时,不能简单将当前Cache行使无效,因为这个使无效操作将丢失阴影部分的有效数据。随后CPU将状态位为M的Cache行与存储器进行同步后,再使无效这个Cache行。......
2023-10-20
TOLUD~4GB这段PCI总线地址空间主要映射和ICH相连的PCI设备地址空间,此外还包括EPBAR指向的空间,以及MCHBAR和DMIBAR指向的空间等。FSB Interrupts存储器空间与MSI中断机制相关,PCIe设备向这段存储器空间进行写操作时,MCH将这个写操作转换为FSB总线的Interrupt Message总线事务。DMI Interface负向译码空间被分为若干段,用来映射ICH使用的PCI总线地址空间。这些PCI设备的BAR空间被映射到这段空间。由以上说明可以发现与MCH连接的PCIe设备的访问延时小于与ICH连接中的PCIe设备。......
2023-10-20
最后这段程序使用acpi_pci_irq_enable函数为当前PCI总线树上的所有PCI设备分配irq号。pcibios_init→pcibios_resource_survey函数将检查当前处理器系统的所有PCI设备的BAR空间,该函数并不会操作PCI设备的BAR寄存器,而只是检查当前处理器系统中所有PCI设备的pci_dev→resource参数是否合法。源代码14-36 pci_find_parent_resource函数pci_find_parent_resource首先对PCI桥管理的地址空间进行检查。pcibios_init函数主要操作Linux系统中的数据结构,并没有对PCI设备的BAR寄存器进行读写操作。......
2023-10-20
值得注意的是,在不同处理器体系结构中,Linux系统初始化PCI总线的过程并不相同。Linux x86将继承BIOS对PCI总线的初始化成果,并在此基础上进行Linux PCI子系统的初始化,并执行PCI设备的Linux驱动程序的初始化模块。在Linux x86中,PCI总线的初始化由一系列模块协调完成。在Linux PCI中,有两个常用的数据结构,分别为pci_dev和pci_bus结构。......
2023-10-20
而桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。PCI总线规范将PCI主从设备统称为PCI Agent设备。PCI规范也没有规定如何设计HOST主桥。在PCI总线中,还有一类特殊的设备,即桥设备。本书重点介绍PCI桥,而不介绍其他桥设备的实现原理。PCI桥的出现使得采用PCI总线进行大规模系统互连成为可能。其中对PCI设备配置空间的访问可以从上游总线转发到下游总线,而数据传送可以双方向进行。......
2023-10-20
下面开始对PLC进行编程。单击图4-6左下角的“Portal视图”,返回到Portal视图,单击左侧的“PLC编程”项,可以看到选中“显示所有对象”时,右侧显示了当前所选择PLC中的所有块,双击“main”块,打开程序块编辑界面,如图4-7所示。也可以在项目树下直接双击打开PLC设备下程序块里的“main”程序块。......
2023-06-15
而这个PCI桥的Secondary Bus在接收Dock设备的请求时仍然使用正向译码方式。PCI桥使用的正向译码方式与PCI设备使用的正向译码方式有所不同。值得注意的是,PCI总线并没有规定HOST主桥使用正向还是负向译码方式接收这个存储器读写总线事务,但是绝大多数HOST主桥使用正向译码方式接收来自下游的存储器读写总线事务。......
2023-10-20
图12-11 Capric卡的DMA写过程首先处理器填写Capric卡的WR_DMA_ADR、WR_DMA_SIZE和DCSR2寄存器,经过延时D0之后,这些命令陆续到达Capric卡。Capric卡收到处理器的DMA写请求后,将向RC连续发送存储器写TLP,并由RC将数据写入到主存储器。处理器收到MSI报文后,将执行中断处理程序,Capric卡的中断处理例程通过RC读取中断控制状态寄存器INT_REG,并结束整个DMA写操作。首先处理器填写Capric卡的寄存器启动DMA读。......
2023-10-20
相关推荐