PCI总线操作三: PCI总线协议的基础

本文介绍了PCI总线协议的基本机制,包括burst的概念及其组成、基本的总线控制信号、寻址原理以及Transaction Ordering规则等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCI总线协议的基础

注:看完之后,觉得还要详细研读一下spec。以前的理解可能不深刻。

PCI总线上动作最基本的机制是burst。一个burst由一个地址phase和一个或多个数据phase组成。Memory、io空间的访问也支持burst。总线上所有信号都是在clock的上升沿取样的,除了resetpin和中断pin。

 

一、基本的总线控制

PCI总线上所有的数据传输都是通过下面三个信号控制的:

FRAME#: 由master驱动,表示传输的开始和结束。

IRDY#:  由master驱动,表示master已经准备好传输或者接受数据

TRDY#: 由target驱动,表示targe已经准备好传输或者接受数据。

如果FRAME#和IRDY#处于deasserted状态,那么总线是处于Idle状态的。FRAME#被asserted之后的第一个clock是寻址phase,地址和总线命令从该clock edge开始传输。后续是一个或者多个 data phase,当然需要IRDY#和TRDY#同时被asserted,如果IRDY#和TRDY#中的任何一个被deasserted,则总线处于wait cycles。

数据源头在准备好数据之后,无条件的assert xRDY#信号(比如,IRDY#在write周期,TRDY#在Read周期)。而在接收端,如果,还没有准备好接受数据,则可以延迟xRDY#的assertion。

在结束传输的时候,不管是master还是targe,都不能随意的终止或者改变动作,除非此次数据传输已经完成了。比如,master asserted IRDY#之后,它不能随意的改变IRTY#和FRAME#的状态,而不考虑TRDY#。而target在assertedTRDY#之后,在当前data phase没有完成之前,都不能随意改变DEVEL#和TRDY#的状态。

 

 

二、寻址

PCI总线协议定义了三个地址空间:memory 地址空间、IO地址空间和配置空间。这里主要描述memory、io的地址空间的访问。

PCI设备内部的register是通过BAR寄存器来映射到memory或者io中的。PCI BIOS配置程序会在BAR中填写设备映射的memory、io空间的基地址。一般情况,推荐使用memory地址空间,因为IO空间是有限的。

 

PCI总线上的地址译码是分布式的,也就是说每个设备都要处理总线上的译码周期。但是只会有个一个对应的设备来响应地址译码,每个设备只负责响应自己的地址译码信号。PCI支持两种类型的地址译码:positive 和subtractive。一般来说positive方式译码会快一些,因为其寻址的地址是在Address windows中的,一比较就能知道是否在范围之内,类似于比较法。而subtractive译码则针对某个pci设备,此设备不被positive译码寻址到的,也就是类似于排除法的意思了。

 

AD总线上的AD[1:0]两个值是因地址空间而可变的。在IO地址空间中,所有32跟AD线都是用来提供全字节寻址的。AD[1:0]用来生成DEVSEL#,并且与BE#对应的。例如,如果BE0#被asserted,那么AD[1:0]将会是“00”,如果BE3#被asserted,那么AD[1:0]是“11”,表示byte3.如果访问中BE#没有被asserted,则AD[1:0]为“xx”。

如果设备发现寻址地址是自己的,那么会译码AD线,并asserted DEVSEL#。表示“好吧,我被发现”了。当然AD线所表示要收到目标设备的地址空间属性限制。例如,设备支持的地址空间是4字节对齐的,那么就不需要译码AD[1:0]。如果当前访问中BE#不是设备定义的对齐字节,则设备会以Target-Abort终止当前访问。

对于memory命令的传输,所有设备都需要确认AD[1:0]线。

 

三、TransactionOrdering

PCI总线的传输ordering需要完成如下三件事:第一,必须满足Producer-Consumer Model 的Write-resultsordering要求。第二,允许一些传输类型为Posted,以改善性能。第三,当Posting buffer被flushed时候,防止死锁的条件发生。(详细请查看PCI spec 相关章节,比较抽象)

 

这里涉及几个概念

1、  Posted 和NON-Posted 。

PCI总线属于多层次多bus的系统,以transaction经过bridge的方式区分,可以分成Posted传输和NON-Posted传输。Posted传输时指原始端总线动作完成的比目标端总线的完成早。类似于没有反馈的传输。中间环节的bridge必须接受这些transaction,并且有责任保证该transaction能够到达目的。Pci总线上下列允许posted:memory writes(Memory Write 和Memory Write and Invalidate)。

相对应NON-Posted 传输指目标端总线的动作完成比原始端的动作完成早,类似于原始端需要等待目标端的反馈。 Memory read(Memory Read,Memory Read Line、Memory Read Multiple),IO传输(IO Read 和IO Write),和配置传输(Configuration Read 和Configuration Write)都是NON-Posted。

2、  四点Ordering的规则。

由于Bridge可以实现投递memory write 传输以不同的方向通过bridge,并且涉及到一些Bridge随时有可能清空其posting buffers。如果不采取一些规范的话,可能会导致出现死锁的情况发生。

A、 对于多个Postedmemory write,必须保证原始端的order和在目标端完成的order要一致。

B、 Bridge中经过的某个方向的Writing传输流的顺序不会干涉Bridge中其他方向经过的Writing传输流

C、 当Read 传输完成之前,必须flush掉两个方向的Postedmemory write buffers。

D、 为了防止不出现死锁的现象,必须保证Post的传输优先级不能高于NON-Posted的优先级。

 

当Posted Write数据不被接受时产生的死锁。当有Write transaction 和Read transaction同时出现的时候,考虑到前面C点所说的规则,如果Write data在Read传输动作之前而优先完成的,那么总线就会出现死锁现象。

 

 

 

### PCIE协议详解中文文档资料 #### 关于PCIE协议的特点与应用 PCIE(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,提供了更高的带宽效率和更低的I/O引脚数。该技术广泛应用于服务器、台式机以及嵌入式系统中,支持热插拔功能并兼容多种设备接口[^2]。 #### 物理链路及拓扑结构描述 在硬件层面,PCIE通过点对点连接方式构建起复杂的网络拓扑;其基本组成单元称为Segment,由多个Switches 和 Endpoints构成。每个Endpoint可以看作是一个独立的功能模块,而Switch则负责管理这些Endpoints之间的通信路径。整个架构呈现出树状分支形态,其中Root Complex位于顶端作为核心控制器。 #### 数据传输机制说明 PCIE定义了两种主要的数据传送模式:完成请求(Completion)和未完成请求(Request),它们共同作用来实现可靠的信息交换过程。此外还存在种不同层次上的封装形式——事务层(Transaction Layer)、数据链路层(Data Link Layer) 及物理层(Physical Layer)[^1]。 #### 事务类型的分类列举 根据具体操作需求的不同,PCIE规定了几种常见的事务类别,包括但不限于配置读写(Configuration Accesses)、内存访问(Memory Operations)等。每一种类型都有各自特定的消息格式与处理流程,在实际部署过程中需严格遵循相应规范以确保系统的稳定运行。 对于希望深入了解PCIE协议细节及其最新进展的学习者来说,《PCIE处理层协议中文详解》提供了一个详尽的技术指南;而对于想要获取更全面视角的人群,则可以从《沧小海笔记之PCIE协议解析——第一章 PCIE概述(上)》开始阅读。另外,《PCIE 6.0基础规范的中文版》也是一份不可多得的重要参考资料,它不仅涵盖了最新的版本特性,而且拥有详细的章节划分便于查阅学习[^3]。 ```python # Python代码示例用于展示如何解析PCIE相关文件 import xml.etree.ElementTree as ET def parse_pcie_config(file_path): tree = ET.parse(file_path) root = tree.getroot() for child in root: print(f"{child.tag}: {child.attrib}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值