# 总线
## 总线
- 总线的基本概念
- 总线的组成和性能指标
- 总线事务和定时
## I/O接口
- I/O接口的功能和基本结构
- I/O端口和编址
## I/O方式
- 程序查询方式
- 程序中断方式
- DMA方式
总线和输入输出系统
1 - 总线
基本概念
总线是一组电子导线或信号线,它们允许不同的硬件设备(如 CPU、内存、输入/输出设备等)之间进行数据传输和通信。总线是计算机内部和外部设备之间的信息传递通道。
总线分类
按照功能分有三类总线
- 核内总线:在处理器核内部各元件之间连线的总线称为核内总线,可连接核内各寄存器、ALU、指令部件等
- 系统总线:指连接 CPU、主存和 I/O 接口等主要部件的总线,通常所说的总线是指这类在系统主要模块之间互连的总线。下面要介绍的也是这种系统总线。
- 通信总线:计算机系统之间或计算机系统与其他系统(远程通信设备、测试设备)之间进行通信的总线,又称外部总线
按照数据传送方式分有两类总线
- 串行总线:只含有一条双向数据线或两条单向数据线,数据按位分时传送。适合远距离通信,大多数通信总线属于串行总线
- 并行总线:含有多条双向数据线,可实现多位同时传送。传输效率高,但相邻数据线之间会相互干扰,适合近距离传输。大多数系统总线属于并行总线
按照时序控制方式
- 同步总线:采用公共的时钟信号进行定时,挂接在总线上的所有设备都从时钟线上获得定时信号
- 总线定时以最慢设备所用时间为标准,因此适合于存取时间相差不大的多个功能部件之间的通信
- 由于时钟偏移问题,导致同步总线不能过长,否则会降低总线传输效率
- 同步总线常采用并行传输,即总线的数据条数为 8、16、32 或 64 位等
- 异步总线:总线上连接的各部件或设备没有统一的时钟,而是依靠各自内部的定时操作,通过信号握手的方式来进行规定的总线操作,从而完成部件或设备之间的数据传输
- 由于同步并行总线使用快速且长的传输线时,会导致传送到另一端的波形发生变形,从而使得(并行传输的)所有位中最快和最慢的位信号之间的时间差较大,因此现在更多使用异步串行方式进行传输:串行–传输速率可更快+不会影响到其他位
总线架构方式
总线架构方式可以分成单总线、多总线 以及 分层结构三种。
- 单总线结构:
- 在单总线结构中,所有的处理器、存储器和 I/O 设备都通过一个共享的通信通道进行连接。
- 这种设计简单、成本低,但所有设备都必须竞争同一个总线,可能导致瓶颈。
- 多总线结构:
- 多总线结构通过引入额外的总线来减轻单总线所带来的瓶颈问题。
- 这种结构可能包括一个内部总线,专门用于处理器和主存储器之间的通信,以及一个或多个外部总线,用于处理器和外围设备之间的通信。
- 分层总线结构:
- 在分层总线结构中,总线被组织成层次结构,每一层服务于不同级别的数据传输需求。
- 例如,高速缓存和处理器可能在顶层使用高速总线,而存储器和 I/O 设备可能在下一层使用较慢的总线。
总线组成
系统总线通常由一组控制线、一组数据线和一组地址线构成。也有些总线没有单独的地址线,即数据线和地址线复用。
- 数据总线(Data Bus):数据总线用于在计算机系统的各个组件之间传输数据。它通常由多条并行线组成,每条线传输一个数据位(比特)。
- 位数(数据总线条数)与机器字长、存储字长有关,一般是 8 位、16 位、32 位
- 地址总线(Address Bus):地址总线用于传输内存地址或外部设备的地址信息,以确定数据的存储位置或目标设备。
- 地址总线的宽度决定了系统可以寻址的内存或设备的数量。更宽的地址总线通常允许系统寻址更多的内存或设备。
- 控制总线(Control Bus):控制总线传输控制信号和命令,用于控制各个硬件组件的操作。这些控制信号包括读/写信号、时钟信号、中断信号、复位信号等。控制总线用于协调数据传输和操作的序列。
总线组成和总线架构的关系:
- 在单总线架构中,所有的通信—包括数据、地址和控制信息—都通过同一个物理总线传输。这意味着数据总线、地址总线和控制总线的功能在一个共享的通道上实现。
- 在多总线架构中,数据总线、地址总线和控制总线可能会分别拥有独立的物理通道,或者系统中可能存在专门的总线来处理不同类型的数据流。
常见总线标准
- PCI (Peripheral Component Interconnect):PCI 总线是一种用于连接内部扩展卡(如显卡、网卡、声卡等)到主板的标准。PCI 总线存在多个版本,包括 PCI、PCI-X 和 PCI Express(PCIe),它们在带宽、速度和适用范围上有所不同。
- SATA (Serial Advanced Technology Attachment):SATA 是一种用于连接存储设备(如硬盘驱动器和光盘驱动器)到计算机的总线标准。它广泛应用于个人电脑和服务器中。
- ISA(Industry Standard Architecture):16 位体系结构,只能支持 16 位的 I/O 设备,是已经被淘汰的插槽接口。
- IDE (Integrated Drive Electronics):IDE 是早期计算机中用于连接硬盘驱动器和光盘驱动器的总线标准,现在已经被 SATA 所取代。
- USB (Universal Serial Bus):USB 是一种通用的总线标准,用于连接各种外部设备(如键盘、鼠标、打印机、存储设备等)到计算机。USB 有多个版本,包括 USB 1.0、USB 2.0、USB 3.0、USB 3.1 和 USB 3.2,它们在传输速度和功能上有所区别。
还有一些其他总线标准比如 PCI-Express、EISA 这种,看到能够认出来是总线标准即可。
总线事务
总线事务是计算机总线操作的一个基本单位。一个总线事务通常涉及一系列的操作,这些操作可以是数据的读取或写入。
在一个总线事务中,主设备(发起事务的设备)通过总线控制线对总线进行控制,并发出地址和数据,以及读写信号。从设备(数据被读取或写入的设备)则识别地址,并根据读写信号进行相应的数据交换。
总线事务包含几个主要阶段:
- 请求(Request):主设备发出总线传输请求。
- 仲裁(Arbitration): 如果多个设备同时尝试使用总线,它们必须通过某种仲裁过程来决定哪个设备有权控制总线。这通常涉及一个优先级方案,以防止冲突和数据损坏。
- 寻址(Addressing): 主设备将目标地址放在总线上,以指定事务的目的地,如特定的内存地址或 I/O 设备。
- 传输(Transfer): 一旦地址被确认,数据传输就会发生。这可以是读操作,也可以是写操作。
- 终止(Termination): 一旦数据成功传输,事务就会结束。终止阶段可能包括从设备发出的确认信号,或者主设备撤销其对总线的控制。
总线周期
总线周期是指 CPU 通过总线与存储器或 I/O 接口进行一次数据传输所需的时间。 一个总线周期通常包含多个时钟周期,这些时钟周期可以被分为四个阶段(四个时钟周期 $T_1, T_2, T_3, T_4$):
- 申请分配阶段:主设备进行请求和仲裁。
- 寻址阶段:主设备用地址信息来指明它想读/写的那个从设备是哪一个。
- 传输阶段:主设备向从设备发出读命令或者写命令。
- 结束阶段:主设备把地址信息、读写命令等从总线上撤除,让出总线的使用权。
总线定时
根据 时钟周期 一节可知,计算机中的设备也许并不使用相同的时钟周期,但是设备间在交换数据的过程中需要时间上配合。
这种时间配合的控制过程就叫做总线定时,总线定时包含 同步定时 和 异步定时 两种方式。
同步定时方式
在总线同步定时方式中,数据传输的时钟信号由一个中央时钟源(通常是主时钟源或总线控制器)生成,并将时钟信号传送到所有参与通信的设备。
这个时钟信号每次都产生一个相等的时间间隔,这个间隔为一个总线传输周期,主设备和从设备必须在这个限定的时间内完成规定的操作。
- $T_{1}$ 的上升沿到来时,主模块向从模块发送地址
- $T_{2}$ 的上升沿到来时,主模块发送读命令
- $T_{3}$ 的上升沿到来时,从模块提供数据
- $T_{4}$ 的上升沿到来时,主模块撤销读命令,从模块撤销数据
同步通信适用于总线长度较短(出现信息错误的概率小)及总线所接部件的存取时间比较接近的系统。 如果有的从设备速度较慢,就会跟不上总线的节奏,进而拖慢了主设备的速度。
异步定时方式
在总线异步定时方式中,数据传输的时钟信号不是由中央时钟源统一控制,而是由每个设备自己的时钟信号驱动。完全依靠传送双方相互制约的“握手”信号来实现定时控制,通常我们将交换信息的两个设备称为主设备和从设备,主设备发送“请求”,从设备接收到后回复“回答”。
异步定时根据“请求”和“回答”的类型,可以分为三种类型:
- 不互锁:主设备持续发送请求一段时间,默认从设备接收到请求。
- 半互锁:主设备接收到来自从设备的回答后停止发送请求,从设备发送回答一段时间,默认主设备接收到回答。
- 全互锁:从半互锁的基础上,从设备接收到来自于主设备的回答后停止发送回答。
2 - I/O 系统
输入/输出系统
- 输入设备:用于向计算机系统输入命令和本文或数据,比如鼠标和键盘。
- 输出设备:用于将计算机系统的信息输出到外部进行显示、交换的部件。
- I/O 接口:外部设备和主机之间进行数据传输时进行各种协调工作的逻辑部件,暴扣传输过程中速度的匹配、电平和格式转换等。
- I/O 软件:包含驱动程序、管理程序等,这些程序通过 I/O 指令来实现 CPU 和 I/O 设备的信息互换。
- I/O 端口:接口电路中可以直接被 CPU 访问的寄存器
I/O 接口
I/O 接口是主机与外设之间信息传输的桥梁,用于解决它们之间的同步与协调、工作速度的匹配和数据格式的转换等问题。 它在主机侧和外设侧各提供一个接口:主机侧为内部接口,通过系统总线和 CPU、内存相连;外设侧为外部接口,通过 USB、串/并行电缆等各种接口电缆与外设相连。
通过 I/O 接口,可以在 CPU、主存和外设之间建立一个高效的信息传输“通路”,这个“通路”即:CPU 和内存 —- I/O 总线 —- I/O 接口(带连接器插座的设备控制器)—- 电缆 —- 外设。一个 I/O 接口可以通过多个外部接口连接多个设备。
功能
- 数据缓冲:CPU 寄存器、主存等主机部件的存取速度比外设快很多,因此为了速度匹配,可将数据提前存到 I/O 接口中的数据缓冲区,用以中和高速系统组件和低速外部设备之间的速度差异
- 数据格式转换:主机和外设的数据格式不同,I/O 接口提供数据格式的相互转换,如串并转换、数模转换等
- 控制和定时:为来自系统总线的控制信号和定时信号提供控制和定时逻辑,对内部资源及外设间动作的先后关系进行协调,并对数据通信过程进行控制
- 错误或状态检测:提供可以保存各种状态信息的状态寄存器,CPU 通过读取这些寄存器来了解接口和外设的出错情况或状态
- 与主机和设备通信:上述四个功能都必须通过主机与 I/O 接口之间和 I/O 接口与外设之间的通信来完成
I/O 端口
I/O 端口(输入/输出端口)是计算机与外部设备(如打印机、键盘、鼠标等)进行数据交换的接口。 它们允许 CPU 与外围设备之间进行数据交换。
组成部分
I/O 端口可以根据其功能和传输的数据类型进行分类:
- 数据端口: 用于传输实际的数据。
- 状态端口: 用于传输外围设备的状态信息,例如设备是否准备好。
- 控制端口: 用于传输控制命令,例如启动或停止设备。
编址方式
为了方便 CPU 对于 I/O 端口的访问,需要对各个端口进行编号,每个端口对应一个端口地址。
编址方式主要统一编址和独立编址两种。
- 统一编址(Memory-Mapped I/O):
- 特点:计算机的内存和 I/O 设备都被看做是内存地址空间的一部分,即内存地址和 I/O 地址共享同一个地址空间。
- 优点:访问 I/O 端口和访问内存单元一样,所有访问内存的指令都可以访问 I/O 端口,不用设置专门 的 I/O 指令;也不需要专用的 I/O 端口控制信号,简化了系统总线。
- 缺点:占用一部分 CPU 地址空间。划出的端口地址范围,不能再作为内存地址使用 ,所以减少了内存地址空间。
- 独立编址(Isolated I/O):
- 特点:计算机使用专门的 I/O 指令和地址空间来访问外部设备,与内存地址空间分开。
- 优点:不占用内存空间,而且 I/O 端口地址线根数少,译码电路简单。
- 缺点:需要专用的控制信号和专用的 I/O 指令。
注意
I/O 端口和接口的区别?
- I/O 接口: 是主机和外设之间的交接界面,通过接口可以实现主机和外设之间的信息交换。
- I/O 端口: 是接口电路中可被 CPU 直接访问的寄存器。
I/O 方式
程序查询方式
程序查询方式不断轮询设备状态以判断其是否可以进行数据传输,数据从 设备 → CPU → 主存。
程序查询方式包含以下步骤:
- 查询:CPU 定期查询或检查 I/O 设备的状态寄存器,查看设备是否准备就绪。
- 判断:如果设备未就绪,CPU 会继续执行其他任务或持续轮询;如果设备就绪,则进行数据传输。
- 数据传输:CPU 直接与 I/O 设备交换数据,可以是读操作或写操作。
- 结束:数据传输完成后,CPU 继续执行其他任务,同时继续轮询 I/O 设备状态。
程序中断方式
在程序中断方式中,当 I/O 设备准备好进行数据传输时,会触发一个硬件中断来通知 CPU。 CPU 会暂停当前正在执行的任务,处理中断,然后恢复执行被中断的任务。
相比于轮询方式,CPU 在执行程序中断之前不需要一直检查 IO 设备的状态,这提升了效率。
基础概念
- 系统中断向量:系统中断向量是一个指向中断处理程序入口地址的指针。
- 中断向量表(Interrupt Vector Table, IVT):
- IVT 是一个数据结构,它将中断号映射到中断处理程序的地址。
- 每个中断向量都包含中断处理程序的入口地址。
- 中断服务程序(Interrupt Service Routine, ISR):中断处理程序是一段特殊的代码,用于响应特定的中断事件。
- 保存被中断程序的上下文(寄存器状态等)。
- 处理中断事件,例如读取硬件设备的数据、响应软件错误等。
- 恢复被中断程序的上下文,使程序能够从中断点继续执行。
CPU 可以通过 INT <中断号>
指令来执行特定的中断。
当中断发生时,CPU 会根据中断类型(中断号)查找中断向量表,找到相应的中断向量。然后,CPU 会使用中断向量中的地址,跳转到对应的中断处理程序执行。
中断处理过程
中断处理的详细过程如上图所示,总的来说,中断处理包含如下过程:
- 中断触发:
- 当外部设备完成操作或需要注意时,它会发送一个信号到处理器的中断请求(IRQ)线路。
- 如果中断使能,并且当前的中断优先级允许,处理器会响应这个中断信号。
- 中断识别:
- 处理器完成当前指令的执行,并开始中断处理过程。
- 处理器检查中断向量表(一个存储了不同中断处理程序地址的表),确定哪个中断被触发。
- 保存断点:
- 处理器会保存当前任务的状态,通常包括程序计数器(PC)、程序状态字(PSW)和其他必要的寄存器,以便中断处理完成后能够恢复。
- 中断屏蔽(关中断):
- 在执行中断服务程序之前,处理器会禁止或优先级屏蔽进一步的中断,以防止中断处理程序被其他中断打断。
- 执行中断服务程序:
- 处理器根据中断向量表跳转到相应的中断服务程序(ISR)。
- 恢复上下文:
- 中断服务完成后,处理器通过恢复之前保存的状态(上下文)来恢复中断之前执行的任务。
- 中断返回:
- 处理器执行一条专门的中断返回指令(比如 x86 架构中的 IRET 指令),该指令将程序计数器(PC)和程序状态字(PSW)等恢复到中断前的值,然后继续执行中断之前的程序。
注意
保护断点和保护现场的区别
一般来说,程序的上下文包含 CS:IP(断点) 以及 各种寄存器(现场),所以 保存上下文 也包含 保存断点
- 保存断点:由 中断隐指令 自动保存(硬件 完成),保存 CPU 在中断时即将执行的指令地址,即通过寄存器
CS:IP
指向的内存地址,完成中断后可通过保存的CS:IP
内容恢复下一条指令的执行。 - 保存现场:在 中断服务程序 内保存(软件 完成),中断服务程序可能会使用到 CPU 中的某些寄存器,通过保存这些寄存器的内容,确保在中断程序执行完后,CPU 可以恢复到执行中断服务程序前的状态。
多重中断和中断屏蔽
若 CPU 在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而 CPU 对新的中断请求不予响应,则这种中断称为单重中断。
若 CPU 暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套。
CPU 要具有处理多重中断的功能,必须满足下列条件:
- 在中断服务程序中提前设置开中断指令。
- 优先级高的中断源有权中断优先级低的中断源。
可以利用中断屏蔽技术动态调整中断处理优先级,每个中断源都有一个屏蔽触发器,1 表示屏蔽该中断源的请求,0 表示可以正常申请,所有的屏蔽触发器组合在一起便构成一个屏蔽字触发器。
如上图,中断屏蔽字中的每一位表示在执行一个中断的时候,我们是否屏蔽来自于其他中断源的请求。比如 B 的优先级高于 C、D,所以在处理来自于中断源 B 的中断时,需要屏蔽 B、C、D,即屏蔽字为 0100。
DMA 方式
DMA(Direct Memory Access,直接内存访问)是一种计算机系统的 I/O(输入/输出)方式,它允许外部设备直接访问主内存而无需 CPU 的干预。
有了上面的程序中断方式,虽然在一定程度上实现了 CPU 和外设的并行工作,但并不完全并行。CPU 只是在外设的数据准备阶段可以去执行其他程序而不需要原地等待,在执行中断服务程序传输数据时仍要全程参与。因此如果是高速 I/O 设备,CPU 仍要频繁的暂停现行程序去处理中断。 DMA 方式就是为了解决程序中断方式的这种缺陷,它增加了 “数据传输过程与主程序并行工作” 的特点。
原理
DMA 让数据传送不再需要经过 CPU,而是直接在外设和内存之间开辟一条“直接数据通路”,使得数据传送期间不再需要占用 CPU 时间处理中断、保护断点和恢复 CPU 现场等繁琐操作。
在 DMA 方式中,CPU 只参与预处理(CPU 通过初始化程序来设置 DMA 控制器的个参数寄存器的初始值,如内存首地址、字计数值等)和后处理过程(传送完成后 CPU 会进行数据校验等工作)。通常适用于以块读写的设备。
DMA 控制器
DMA 控制器由以下若干组件构成:
- 主机-控制器接口
- DR(数据寄存器):暂存从设备到内存或从内存到设备的数据。
- MAR(内存地址寄存器):暂存数据在内存中的地址。
- DC(数据计数器):表示剩余要读/写的字节数。
- CR(命令/状态寄存器):用来存放 CPU 发来的 I/O 命令,或设备的状态信息。
- I/O 控制逻辑
- 块设备-控制器接口
步骤
DMA 方式与中断 I/O 方式一样,也是采用 “请求-响应” 的方式,只是中断 I/O 方式请求的是处理器的时间,DMA 方式请求的是总线控制权。如下图,为进程 P1 在磁盘和主存之间进行数据交换的过程示意图:
DMA 进行 I/O 传输包含如下过程:
- 预处理:在进行 DMA 传输之前,CPU 需要进行初始化设置,包含源地址、目标地址、数据传输长度以及数据传输方向。
- DMA 请求:外设向 DMA 控制器发送 DMA 请求,并向 CPU 发送总线请求。
- 获取总线控制权:CPU 响应总线请求,发出总线响应信号,DMA 控制器接管总线控制权,进行 DMA 操作周期。
- 数据传输:DMA 控制器进行数据传输,这个过程不需要 CPU 的干预。
- 释放总线控制权:一旦 DMA 控制器完成数据传输,它会发出 DMA 传输完成信号,通知外设设备数据已经传输完毕。同时 DMA 控制器会释放总线控制权,使 CPU 可以继续执行其他任务。
使用总线方式
在 DMA 方式中,DMA 接口和 CPU 共享主存,因此它们同时访问主存时,会出现总线的争用问题,为了实现主存的分时复用,有以下三种方法:
- 总线独占(Bus Mastering):
- 在这种模式下,DMA 控制器会取得对总线的独占控制权。在传输期间,CPU 将无法访问内存,因为总线已经被 DMA 控制器占用了。
- 在独占期间,CPU 通常会执行不涉及内存访问的指令,如计算或寄存器操作,或者进入等待状态直到 DMA 操作完成。
- 周期挪用(Cycle Stealing,也叫做循环窃取):
- 在循环窃取模式下,DMA 控制器会逐个窃取总线周期来进行数据传输,而不是一次性占据所有的总线周期。
- 这意味着 CPU 在 DMA 控制器未使用总线时仍然可以访问内存。因此,DMA 和 CPU 会交替使用总线,通常不会显著影响 CPU 的操作。
- 分时多路复用(Time-Division Multiplexing):
- 在分时多路复用模式下,DMA 控制器和 CPU 会在预定的时钟周期内轮流使用总线。
- 这种方式确保了 CPU 和 DMA 控制器都可以在它们的时隙内访问内存,但都无法全时段访问。
注意
CPU 和 DMA 控制器哪一个对于总线访问的优先级更高?
当 CPU 和 DMA 都需要访问主存时,DMA 控制器可以优先获得总线使用权。因为磁盘一旦开始读写,就必须按时完成数据传送,否则数据缓冲区中的数据会发生丢失。