总线的基本概念与分类
总线的基本概念与分类
复习定位
总线是一组共享的信号线——把所有硬件挂接在一起。它的核心矛盾是"共享":同一时刻只能有一个设备发送数据,否则信号冲突。这个矛盾衍生出总线仲裁、分时复用、同步/异步协议等一系列技术。理解总线是理解CPU为什么不能和所有设备同时通信的出发点。
总线是什么以及为什么需要总线
如果每个部件之间都拉独立的导线——n个部件需要n(n-1)/2条连接——集成度不可接受。总线把所有设备连接到同一组信号线上——新设备只需挂到总线上即能通信——可扩展性大大提高。总线是三态逻辑总线——每个设备通过三态缓冲器连接到总线——发送数据时使能缓冲器、不发送时切换到高阻态以释放总线供其他设备使用。
总线的消极面是"共享"——任何时刻只能有一个设备被允许发送数据(否则多个信号叠加后不可解析)。多个设备可以同时接收——收的目标由地址信号决定。每次总线事务都包含三个阶段:仲裁(确定谁发)→寻址(发给谁)→数据(传输数据)。
三组信号线的功能分工
地址总线(AB, Address Bus):单向——CPU(或主设备)向从设备传输地址。地址线的位数决定了CPU能访问的最大内存空间——32根地址线寻址2^32=4GB、36根线=64GB、48根线=256TB(x86-64的实际限制)。CPU把要读写的物理地址加载到地址总线——目标设备(内存/IO控制器)通过比较地址范围判定自己是否被选中。
数据总线(DB, Data Bus):双向——CPU和内存/I/O设备之间传输数据。数据线的宽度(位数)决定了一次总线传输能传送多少字节——32位总线一次传4字节、64位总线一次传8字节。数据线宽度越宽,CPU取指和读写数据的速度越快——x86从8088的8位数据线发展到现代x86-64的64位数据线。
控制总线(CB, Control Bus):一组信号线,传递控制信号——时钟同步、读写命令、中断请求、总线请求/应答、复位等。每个控制信号有专用线——INTR(中断请求)、HLDA(保持应答)、IOWR(IO写)、IOR(IO读)、MEMRW(内存读/写)等。控制总线的线数没有统一标准——CPU厂商自行决定。
总线的层次分离
大型系统中不再只有一根总线——根据传输速度和连接对象分为三层:
CPU总线(也称前端总线FSB/系统总线):连接CPU到内存控制器——现代CPU已把内存控制器集成到片内——这一层转变为CPU内部互联(Intel的环形总线、AMD的Infinity Fabric)和连接PCIe控制器的端口。速度是总线的最高端——可达数万MB/s。
局部总线(PCIe):连接CPU到高速外设——显卡、NVMe SSD、万兆网卡。PCIe是点对点串行链路——每对设备之间有独占的通道——不再共享总线争用。PCIe的带宽随版本升级——x16通道在PCIe5.0上提供约32GB/s单向带宽。
通信总线(也叫外设总线):连接I/O设备到芯片组——USB(480Mbps~40Gbps)、SATA(6Gbps)、Ethernet等。速度和延迟都远低于前两类——但热插拔和兼容性是其核心要求。
同步总线 vs 异步总线
同步总线:由统一的时钟信号驱动——所有设备在时钟上升沿或下降沿检测信号和发送数据。优点是协议简单——设备只需在给定时钟沿做出响应。缺点是所有设备必须运行在同一时钟频率下——如果一个设备速度慢,整个总线必须降速配合。同步总线还会在各设备之间产生时钟偏移(clock skew)——频率越高、总线长度越长——信号到达各设备的传播延迟差异越大会导致不同设备在不同时间收到不一致的时钟沿——限制了总线的物理长度。
异步总线:不使用统一时钟——通过握手信号(Request和Acknowledge)协调传输。主设备发出请求信号→从设备准备好后回复应答信号→主设备看到应答开始传输。优点是设备速度可以不同——慢速设备可以延迟应答信号、快速设备可快速应答。缺点是每次传输需要握手信号多次跳变——开销大于同步总线的单时钟周期。
总线事务的四个阶段
一次完整的总线事务通常包含:
- 请求阶段:主设备向总线仲裁器请求总线使用权(REQ#→GNT#)
- 寻址阶段:主设备把目标地址加载到地址总线—发控制信号确认读写方向
- 数据阶段:主设备或从设备把数据传输到数据总线(读——从设备控制数据线、写——主设备控制数据线)
- 结束阶段:主设备释放总线控制权——允许下一个事务开始
同步总线的数据阶段可以持续多个时钟周期进行突发传输——每次突发传输在无等待状态下每周期传一批数据——不需要每笔32字节地址再逐个传输。
复习检查
为什么总线上一次只能有一个设备发送?如果两个设备同时向数据总线加载信号——发生了什么?
32位地址总线的最大寻址能力为什么是4GB而不是16GB——计算过程是什么?
同步总线在两个设备速度不同时为什么必须降速配合——异步总线的握手信号如何避免这个困境?
数据总线的宽度(32位vs64位)对一次取指令的影响——CPU取一条64位指令需要几个总线周期?
PCIe的"点对点链路"和传统PCI的"共享总线"——在多个设备并发通信时的行为有什么本质不同?