本节目录
一、HOST处理器访问PCI设备
1、X86处理器通过I/O读写事务访问PCI设备
2、PowerPC处理器通过I/O读写事务访问PCI设备
3、处理器通过存储器读写事务访问PCI设备
二、PCI设备读写主存储器
三、Delayed传送方式
四、Split总线事务
本节内容
一、HOST处理器访问PCI设备
HOST处理器访问PCI设备的数据,包括两个方面:
一是处理器向PCI设备发起存储器和I/O读写请求;
二是处理器对PCI设备进行配置读写。
BAR空间——在PCI设备的配置空间中,有6个BAR寄存器。每一个BAR寄存器均与PCI设备使用一组PCI总线地址空间对应,BAR寄存器里面存放这种空间地址的基地址。与BAR寄存器相对应的PCI总线地址空间,称为BAR空间,在BAR空间中可以存放I/O地址空间,也可以存放存储器地址空间。
需要注意的是:BAR寄存器中存放的是PCI总线域的物理地址。
1、X86处理器通过I/O读写事务访问PCI设备
X86处理器,具有独立的I/O地址空间,与PCI设备通信:
①将PCI设备使用的I/O地址映射到存储器域的I/O地址空间;
②处理器使用IN、OUT等指令对存储器域的I/O地址进行访问;
③HOST主桥将存储器域的I/O地址转换为PCI总线域的I/O地址;
④PCI总线I/O总线事务对PCI设备的I/O地址进行读写访问操作。
也就是说,在X86处理器中,存储器域的I/O地址与PCI总线域的I/O地址相同。
2、PowerPC处理器通过I/O读写事务访问PCI设备
PowerPC处理器,没有独立的I/O地址空间,与PCI设备通信:
①在HOST主桥初始化时候,将PCI设备使用的I/O地址空间映射为存储器地址空间;
②处理器对映射后的存储器地址空间读写访问操作时,HOST主桥将存储器域的这段存储器地址总线映射到PCI总线域的I/O地址;
③通过PCI总线的I/O总线事务进行读写操作。
3、处理器通过存储器读写事务访问PCI设备
①HOST处理器初始化时候,将PCI设备使用的BAR空间映射到存储器域的存储器地址空间;
②处理器通过存储器读写指令访问存储器域的存储器地址空间;
③HOST主桥将存储器域的读写请求翻译成PCI总线的存储器读写总线事务,再发送给目标设备。
注意:PCI设备所能够直接使用的地址是PCI总线域的地址,PCI总线域的地址;而处理器所能使用的地址是存储器域的地址。
二、PCI设备读写主存储器
PCI设备与存储器直接进行数据交换的过程被称为DMA,PCI设备需要获取数据传送的目的地址和传送大小,在BAR空间设置PC设备DMA控制器的两个寄存器分别用于保存目标地址和传送大小。
注意:PCI设备进行DMA操作,使用的目的地址是PCI总线域的物理地址,不是存储器域的物理地址。原因是PCI设备无法识别存储器域的物理地址,而仅能识别PCI总线域的物理地址。
HOST主桥负责完成PCI总线地址到存储域地址的转换,HOST主桥需要通过合理设置,将存储器的地址空间映射到PCI总线后,PCI设备才可以对这段存储器的地址进行DMA操作。对于没有经过HOST主桥映射的存储器空间,PCI设备是不能直接访问的。
注意:在处理器系统中,并非所有的存储器空间都可以被PCI设备访问,只有在PCI总线域有映射得存储器空间才能被PCI设备访问。经过HOST主桥映射过的存储器对应两个地址,一是在存储器域的地址,用于处理器访问这段存储器空间;二是在PCI总线域的PCI总线地址,用于PCI设备访问这段内存。
三、Delayed传送方式
处理器使用Non-Posted总线周期对PCI设备进行读操作,或者PCI设备使用Non-Posted总线事务对存储器进行读操作时,如数据没有到达目的地,那么这个读操作逻辑上的所有PCI总线都不能被释放,将严重影响PCI总线的使用效率。
由此引出了Delayed传送方式,PCI桥对Non-Posted总线事务进行优化处理,并使用Delayed总线事务处理在Non-Posted总线事务。PCI总线规定只有Non-Posted总线事务可以使用Delayed总线事务。PCI总线的Delay总线事务由Delay读写请求和Delay读写完成总线事务构成。
四、Split总线事务
为了进一步提供Non-Posted总线事务的执行效率,PCI-X总线将PCI总线的Delay总线事务,升级为Split总线事务。Split总线事务的基本思想是发送端首先将Non-Posted总线请求发送给接收端,再由接收端主动地将数据传递给发送端,有效解决HOST/PCI桥的重试操作。
目前PCIe中也是采用Split总线事务进行数据传输。一个存储器读总线事务的例子,总线事务的发起方Requester采用Split总线事务与接收端Completer进行数据交换,具体步骤:
①Requester向Completer发起存储器读请求总线事务;
②在这个转发过程中经过多级PCI类型的桥,这些桥使用Split Responese周期结束当前总线事务并释放上游总线,转发存储器读请求,直到Completer接收这个总线事务;
③Completer接收存储器读请求后,记录Requester的ID号,并使用Split Response周期结束存储器读请求总线事务;
④Completer准备好发送数据,重新申请总线,并使用存储器读完成总线事务,主动将数据传送给Requester。报文中包括Requester ID号,采用ID路由,而不是地址路由;
⑤完成报文根据ID路由方式,最终到达Requester。Requester从完成报文中接收数据并完成整个存储器读请求。