# 总线
## 总线
- 总线的基本概念
- 总线的组成和性能指标
- 总线事务和定时
## I/O接口
- I/O接口的功能和基本结构
- I/O端口和编址
## I/O方式
- 程序查询方式
- 程序中断方式
- DMA方式
总线和输入输出系统
1 - 总线
总线概念
总线 是一组电子导线或信号线,它们允许不同的硬件设备(如 CPU、内存、输入/输出 设备等)之间进行数据传输和通信。总线是计算机内部和外部设备之间的信息传递通道。
总线类型
总线可以按照不同的角度进行分类:
- 按 功能,可分为数据总线、地址总线和控制总线;
- 按 连接对象和用途,可分为核内总线、系统总线和通信总线;
- 按 数据传送方式,可分为串行总线和并行总线;
- 按 时序控制方式,可分为同步总线和异步总线。
这些分类标准彼此独立,同一条总线可以同时具有多种属性。例如,PCIe 按连接对象属于系统总线,按数据传送方式属于串行总线;某条系统总线也可能采用同步或异步的时序控制方式。因此,不能将“数据总线”“系统总线”“串行总线”“同步总线”等概念视为互斥的同级分类。
功能
系统总线 通常由 数据总线、地址总线 和 控制总线 三部分组成。也有些总线没有单独的地址线,而是采用 地址/数据复用 的方式,即地址线和数据线共用同一组物理线路。
- 数据总线(Data Bus):用于在计算机各部件之间 传输数据。通常由多条并行线路组成,每条线路传输一个数据位(bit)。
- 数据总线的宽度通常与 机器字长 或 存储字长 有关,常见为 8 位、16 位、32 位、64 位等。
- 地址总线(Address Bus):用于传输 内存地址 或 I/O 设备地址,以确定数据的存储位置或目标设备。
- 地址总线的宽度决定了系统能够寻址的地址空间大小,地址线越多,可访问的内存或设备越多。
- 控制总线(Control Bus):用于传输各种 控制信号 和 状态信号,协调各硬件部件之间的数据传输。
- 常见控制信号包括 读/写信号、时钟信号、中断信号、复位信号 等。
功能分类与总线架构的关系:
- 在 单总线结构 中,数据总线、地址总线和控制总线共享同一条物理传输通道,通过不同的控制方式完成各自功能。
- 在 多总线结构 中,不同类型的信息可能通过不同的物理总线传输,例如专门的数据总线、地址总线,或独立的 I/O 总线、存储总线等,从而提高系统性能。
连接对象
- 核内总线:在处理器核内部各元件之间连线的总线,可连接核内寄存器、ALU、指令部件等。
- 系统总线:连接 CPU、主存和 I/O 接口 等主要部件的总线,通常所说的总线就是指这类在系统主要模块之间互连的总线。下面介绍的也主要是这种 系统总线。
- 通信总线:计算机系统之间,或计算机系统与其他系统(如远程通信设备、测试设备)之间进行通信的总线,又称 外部总线。
数据传送方式
总线 的数据传输方式包含 串行 和 并行 两种:
- 串行总线:只含有一条双向数据线或两条单向数据线,数据按位分时传送。适合远距离通信,大多数 通信总线 属于 串行总线。
- 并行总线:含有多条双向数据线,可实现多位同时传送;但相邻数据线之间会相互干扰,距离变长或频率提高后难以保持各位同步,因此更适合短距离传输。大多数 系统总线 属于 并行总线。
试题中常常考查 哪些总线是串行总线,哪些总线是并行总线。
这里核心把握一点:现代高速通信几乎都使用串行总线(PCIe、USB、SATA、DisplayPort),而并行总线主要用于内存、老式设备或非常短距离的高速通信。
常见的串行总线 如下表所示:
| 总线类型 | 简介 |
|---|---|
| USB(通用串行总线) | 广泛用于外设连接,如鼠标、键盘、U 盘。支持热插拔;本质是串行总线,不能理解为“同时传输 2 位数据”。 |
| PCI Express(PCIe) | 高速内部总线,连接显卡、SSD 等,采用点对点串行通信。 |
| SATA(串行 ATA) | 硬盘、SSD 与主板间通信,取代并行 ATA(PATA)。 |
| Thunderbolt | 基于 PCIe 和 DisplayPort 的高速接口,可同时传输视频和数据。 |
| DisplayPort、HDMI、DVI | 显示器接口,本质上都是高速串行通信。 |
常见的并行总线 如下表所示:
| 总线类型 | 简介 |
|---|---|
| PCI(老式) | 并行总线,早期主板与扩展卡连接标准,已被 PCIe 取代。 |
| ISA(工业标准架构) | 更早期的并行总线,现已淘汰。 |
| IDE / PATA(并行 ATA) | 老式硬盘接口,已被 SATA 取代。 |
| 内存总线(DDR 等) | DRAM 模块仍通过多条并行数据线传输数据,例如 DDR4 数据总线宽度为 64 位。 |
时序控制方式
- 同步总线:采用统一的时钟信号进行定时,挂接在总线上的所有设备都从时钟线上获得定时信号。
- 总线定时以 最慢设备 的访问时间为标准,因此适用于存取时间相近的多个部件之间通信。
- 由于时钟偏移问题,同步总线长度不能过长,否则会降低传输效率。
- 同步总线通常采用 并行传输,如 8 位、16 位、32 位或 64 位数据总线。
- 异步总线:各设备没有统一时钟,而是依靠各自内部定时,通过 握手信号 协调数据传输。
- 当传输距离较长或速率较高时,同步并行总线容易因各位到达时间不同而产生时序偏差,因此现代高速通信更多采用 异步串行方式,既能提高传输速率,又不会受到多条并行线路之间同步问题的影响。
总线的“同步/异步”与后文“总线定时”的关系:
这里的“同步总线 / 异步总线”是按 总线整体的时序特征 进行分类;后文 总线定时 一节介绍的是同一条总线内部 主从设备之间如何协调数据传输时刻 的具体机制(同步定时、异步定时),两者属于同一套思想在不同层次上的描述,应结合理解,而不要孤立记忆。
总线架构方式
总线 架构方式可以分成 单总线、多总线 以及 分层结构 三种。
单总线结构
- 单总线结构 中,所有处理器、主存储器和 I/O 设备 共用一条总线进行通信 。
- 优点是结构简单、实现成本低,适用于设备数量少、通信量低的系统。
- 缺点是所有设备必须轮流访问总线,存在通信冲突和带宽瓶颈,性能扩展性差。
多总线结构
- 多总线结构 在 单总线 的基础上进行拓展,引入多条功能分化的总线,例如系统总线、I/O 总线、存储器总线等。
- 常见做法是将 处理器与主存之间的数据传输 放在一条专用总线(如 CPU-主存总线),而 I/O 设备通过桥接芯片连接至另一条总线(如 I/O 总线)。
- 这样可以显著减轻主总线负载,提高系统并发性和吞吐能力。
分层总线结构
现代计算机系统广泛采用 分层总线结构,其核心思想是在 多总线结构 的基础上进一步 细化总线的功能与等级,以更好适应不同设备对带宽和延迟的需求。
核心特点 :
- 将总线按速率和用途分层,如高速、中速、低速总线;
- 各层通过 桥接控制器(如 PCH)进行协调;
- 高速设备尽量绕过中间桥接器,直连 CPU 提高性能。
- 高速设备的连接方式
- 内存总线 :使用 DDR4/DDR5 等内存通道,由集成在 CPU 内部的内存控制器(IMC)控制,实现低延迟高速访问;
- 显卡 :通过 PCIe 高速通道,直接连接到 CPU 的 PCIe 控制器,适用于图形、大数据等吞吐密集型场景;
- 高速存储 (如 NVMe SSD) :通过 PCIe/NVMe 通道连接,可直连 CPU 或走 PCH。
- 低速或通用设备的连接方式
- 低速设备(如 USB、SATA、音频、网卡等)大多连接至 平台控制器集线器(PCH) 或 南桥芯片,再通过 DMI(Direct Media Interface)总线 与 CPU 通信;
- 这些设备不要求极高带宽,通过桥接方式集中管理,可简化主板设计并降低成本。
总线事务
总线事务(Bus Transaction)是一次完整的数据交换过程,也是总线工作的一个 基本单位。一次总线事务通常完成一次 读操作 或 写操作。
在一次总线事务中,会涉及两个角色:
- 主设备(Master):主动发起总线访问、申请总线控制权,并负责发出 地址、控制信号(如读/写信号)的设备。
- 从设备(Slave):响应主设备发出的地址和控制信号,在被选中后完成数据的读取或写入。
主设备获得总线控制权后,会按照一定时序依次发出 地址、控制信号,并完成 数据传输;从设备识别地址后,根据控制信号返回数据(读操作)或接收数据(写操作),一次总线事务随之结束。
通常情况下:
- CPU 执行访存时,CPU 是主设备,内存或 I/O 接口是从设备。
- DMA 控制器进行数据传输时,DMA 控制器成为主设备,CPU 暂时让出总线,而内存和 I/O 接口仍作为从设备参与数据交换。
总线周期
总线事务 从时间上看,对应的就是一个 总线周期。总线周期(Bus Cycle)是一次总线事务在时间上的体现,即主设备通过总线与从设备完成一次数据传输所经历的时间。一个总线周期通常包含多个时钟周期,在许多同步总线中可划分为四个阶段(对应四个时钟周期 ):
- 请求/申请分配(Request) :若主设备尚未获得总线控制权,则需要申请总线;若多个设备同时竞争总线,还需经过 仲裁(Arbitration)决定总线控制权的归属。
- 寻址(Addressing) :主设备将目标地址放到地址总线上,以指定事务的目的地,如特定的内存地址或 I/O 设备。
- 传输(Transfer) :地址稳定后,主设备发出读命令或写命令,主、从设备按照总线时序完成数据交换。
- 结束/终止(Termination) :数据传输完成后,主设备撤销地址和控制信号,并释放总线控制权(若需要),本次总线周期结束。
总线事务 强调的是一次数据交换过程;总线周期 强调的是完成这次数据交换所经历的时间。
突发总线传输事务
突发(Burst)总线传输事务 是指主设备(如 CPU 或 DMA 控制器)获得总线控制权后,在无需为每个数据单元单独进行地址仲裁或握手的情况下,连续传输多个数据单元(通常是字节或字)。
突发传输的本质是:一次寻址,多次数据传输。 主设备仅在开始时发送一次起始地址,后续数据通过地址自动递增(或固定地址)连续完成传输,从而减少地址和控制信号的开销,提高总线的有效数据传输率。
其主要优点包括:
- 减少地址/控制总线占用:仅在开始时发送一次地址和控制信号,后续数据连续传输,减少了总线控制开销。
- 提高有效数据传输率:减少了地址传送和握手等待时间,使总线更多时间用于实际的数据传输。
- 适用于块数据传输:如高速缓存行填充、内存块拷贝、DMA 数据搬迁等场景,突发传输尤其高效。
提高总线数据传输率的常见手段,真题常给出几种改进措施,要求判断哪些能够提高同步总线的数据传输率,哪些不能:
- 增大总线宽度、提高总线工作频率、采用突发(猝发)传输:三者都能直接提高总线的数据传输率。
- 地址线和数据线复用:本质是用同一组物理线在不同时刻分别传输地址和数据,目的是减少总线信号线数量、降低成本,而不是提高传输率;由于地址和数据不能同时传输,反而可能增加一次传输所需时间。
- 分离式事务(Split Transaction):将一次总线事务拆分为"请求"和"应答"两个独立子事务,在等待从设备准备数据期间释放总线控制权,使其他设备能够继续使用总线,从而提高总线利用率,但并不直接提高单次数据传输率。
可以概括为:提高传输率 关注的是单位时间传输更多数据;提高利用率 关注的是减少总线空闲等待时间,两者并不等价。
总线定时
根据 时钟周期 一节可知,计算机中的各个设备可能工作在不同的速度下,即使采用相同的时钟频率,也可能具有不同的数据准备时间。因此,在设备之间通过总线交换数据时,必须在时间上进行协调,以保证双方能够正确完成数据传输。
这种控制数据传输时序的过程称为 总线定时(Bus Timing),即规定一次总线周期中各个阶段(如申请、寻址、传输、结束)在时间上的先后关系和持续时间。
根据是否采用统一的时钟信号,总线定时可分为 同步定时 和 异步定时 两种方式。
同步定时方式
在 同步定时方式 中,所有设备共用同一个 中央时钟源(通常由主时钟源或总线控制器提供)的时钟信号,并按照统一的时钟节拍完成各阶段操作。
每个总线周期的持续时间是固定的,主设备和从设备都必须在规定的时间内完成各自的操作,因此同步定时实现简单、控制方便。
- 上升沿:主设备发送地址;
- 上升沿:主设备发送读命令;
- 上升沿:从设备提供数据;
- 上升沿:主设备撤销读命令,从设备撤销数据,本次总线周期结束。
同步定时适用于总线较短、设备速度相近的系统。若某个从设备速度较慢,无法在规定时间内准备好数据,则必须延长总线周期或插入等待周期(Wait State),从而降低整个总线的传输效率。
异步定时方式
在 异步定时方式 中,没有统一的中央时钟来规定数据传输节拍,而是由通信双方通过 握手信号 协调数据交换过程。
通常将通信双方称为 主设备 和 从设备:
- 主设备发出 请求(Request) 信号,表示准备开始数据传输;
- 从设备准备好数据或接收到数据后,返回 回答(Acknowledge) 信号;
- 双方依据请求和回答信号完成一次数据交换,而无需依赖固定的时钟周期。
由于数据传输速度完全取决于双方的响应速度,因此异步定时能够适应速度差异较大的设备,但控制逻辑相对更加复杂。
根据请求信号和回答信号的撤销方式,异步定时可分为三种:
- 不互锁:主设备发送请求后保持一段固定时间,然后自动撤销,不等待从设备确认;从设备也默认请求已经送达。
- 半互锁:主设备收到从设备的回答后才撤销请求;从设备发送回答一段固定时间后自动撤销。
- 全互锁:在半互锁基础上,从设备只有在确认主设备已经撤销请求后,才撤销回答,实现双方互相确认,可靠性最高。
在实际计算机系统中,同步定时和异步定时各有适用场景。下表总结了两种总线定时方式的主要区别:
| 同步定时 | 异步定时 | |
|---|---|---|
| 控制依据 | 统一时钟信号 | REQ/ACK 握手信号 |
| 节拍 | 固定(由时钟决定) | 不固定(由握手完成情况决定) |
| 优点 | 控制简单、实现方便 | 能适应速度差异较大的设备 |
| 缺点 | 速度受限于最慢设备(除非插入等待周期) | 控制逻辑复杂 |
同步看时钟,异步看握手。
总线指标
时钟频率 指总线所依赖的时钟信号的频率。它表示的是“时钟脉冲”产生的快慢。
时钟频率 单位 为 Hz,常见如 100MHz、133MHz 等。
总线传输周期总线传输周期 即上面 总线事务与总线周期 一节中的总线周期,指一次完成总线数据传输所需的时间,包括申请、寻址、传输和结束阶段。
一个完整的传输周期可能需要 多个时钟周期。
总线工作频率工作频率 指总线 实际传输数据 的频率。
一般来说,工作频率与时钟频率相同,但有些总线为了提高带宽,会采用 倍频/分频 机制:
- SDR(单倍数据率):每个时钟周期只在一个边沿传输数据,工作频率 = 时钟频率。
- DDR(双倍数据率):在上升沿和下降沿各传输一次,工作频率 = 2 × 时钟频率。
- QDR(四倍数据率):一个周期传四次,工作频率 = 4 × 时钟频率。
更加泛化地说,若总线传输周期 = N 个时钟周期,则总线的工作频率 = 时钟频率 / N。
总线宽度 也叫做总线位宽,是总线上 能同时传输的数据位数,通常指的是数据总线的根数,如 32 根称为 32 位总线。
总线带宽总线带宽 指单位时间内总线能传输的最大数据量,通常用 MB/s、GB/s 表示,计算公式为:
其中 总线宽度 通常以 bit 为单位,代入带宽公式前要除以 8 换算成 Byte;工作频率 指实际完成数据传输的频率,不一定等于时钟频率。
总线指标计算题的统一思路 :
- 先判断题目问的是 带宽/最大传输率,还是 传输一个数据块所需时间。
- 若问带宽,用:
例如 DDR 在时钟上升沿和下降沿都传输数据,每个时钟周期传输次数为 2;三通道内存还要再乘以 3。
- 若问一次块传输时间,要区分 突发传输 和 非突发传输(定义见 突发总线传输事务):
- 突发传输 :通常只在开始时传一次地址,后续连续传输多个数据单元,时间按“地址/准备开销 + 连续数据传输周期数”计算。
- 非突发传输 :每传输一个数据单元都要重新经历地址、准备和数据传输过程,不能只按数据总量除以带宽。
- 若题目给出“总线传输周期 = N 个时钟周期”,则工作频率是时钟频率除以 N;若题目给出“每周期传输 M 次”,则工作频率是时钟频率乘以 M。不要把 时钟频率、工作频率、总线传输周期 混成同一个量。
常见总线标准
需要熟练掌握一些会考察的 总线标准 的名称:PCI、SATA、ISA、IDE、USB,并且能够和其他计算机领域的专业名词区分开来:
- PCI :PCI 总线 是一种用于连接内部扩展卡(如显卡、网卡、声卡等)到主板的标准。PCI 总线 存在多个版本,包括 PCI、PCI-X 和 PCI Express(PCIe),它们在带宽、速度和适用范围上有所不同。
- SATA :SATA 是一种用于连接存储设备(如硬盘驱动器和光盘驱动器)到计算机的总线标准。它广泛应用于个人电脑和服务器中。
- ISA/EISA :ISA(工业标准架构)是 16 位体系结构,只能支持 16 位的 I/O 设备;EISA 是其 32 位扩展版本。两者都是已经被淘汰的插槽接口。
- IDE :IDE 是早期计算机中用于连接硬盘驱动器和光盘驱动器的 总线 标准,现在已经被 SATA 所取代。
- USB :USB 是一种通用的总线标准,用于连接各种外部设备(如键盘、鼠标、打印机、存储设备等)到计算机。USB 有多个版本,包括 USB 1.0、USB 2.0、USB 3.0、USB 3.1 和 USB 3.2,它们在传输速度和功能上有所区别。USB 也是目前 外部设备接入 I/O 控制器 最主流的通用总线标准,而 PCI/AGP/PCIe 主要用于内部扩展卡或显卡这类板级设备,不用来连接外部设备。
总线标准 vs 干扰项 :真题常把 ISA、EISA、PCI、PCI-Express 这类真实存在的总线标准,和 CRT(显示器件)、CPI(每指令周期数)、RAM(存储器件)、MIPS(性能指标)等看似相似但完全不属于总线标准的名词放在一起考查缩写辨析,做题时先排除这些不是总线标准的干扰项。
PCI
Peripheral Component Interconnect

长条形插槽,通常为长方形,长度较长,内部有多个金属触点,呈平行排列,用于插入扩展卡。边缘有一缺口,用于固定卡的位置。
SATA
Serial Advanced Technology Attachment

较小的 L 形连接器,扁平且细长,端口一侧有明显的 L 形弯角,内部有几根细小金属针脚,用于连接存储设备(如硬盘驱动器和光盘驱动器)到计算机。
USB
Universal Serial Bus

矩形接口,较为紧凑,内部有金属触点,常见为USB-A的扁平长方形设计,端口内部有塑料隔板和触点,用于连接各种外设如鼠标、键盘或U盘。
这三个概念是经常被混淆的概念,这里还是多提一嘴。简单来说,接口 是硬件插入的位置,协议 是软件层面用于通信的规则,总线 是硬件之间的数据通路。下表给出一些常见例子来说明:
| 实际例子 | 插槽/接口 | 协议 | 总线 |
|---|---|---|---|
| SATA SSD | SATA 接口 | AHCI 协议 | SATA 总线 |
| M.2 SATA SSD | M.2 插槽 | AHCI 协议 | SATA 总线 |
| M.2 NVMe SSD | M.2 插槽 | NVMe 协议 | PCIe 总线 |
| PCIe 显卡 | PCIe 插槽 | PCIe 协议 | PCIe 总线 |
| USB U盘 | USB-A 接口 | USB 协议(2.0/3.0/3.1 等) | USB 总线 |
需要注意的是,有些名词(比如 SATA、PCIe、USB)是 混合性术语,既可以是 总线,也代表了协议和接口;有些名词(比如 M.2) 仅仅是接口;有些名词(比如 NVMe)仅仅是协议。
2 - I/O 系统
选择题高频考点,主要两点:1. IO 接口和端口。2. 几种 IO 方式的细节和区别。
此外,在解答题中偶尔也会结合总线指标考查一些计算过程,所以需要深入了解几种 IO 方式的细节。
输入/输出系统
以主机为中心 来看,将信息从外部设备传送到 主机 的过程称为 输入;将信息从 主机 传送到外部设备的过程称为 输出。
简单架构
让我们首先来看一个早期简易 I/O 系统的架构(一般考查的也就是这种架构):
在这个架构中,各部分的基本功能如下:
- CPU 是整个计算机系统的控制和运算核心,它负责:发出控制命令(如读/写指令)以驱动外设;通过 I/O 总线 访问设备控制器,进行地址寻址、数据传输和状态监测;与 内存 协同,完成数据的读取、处理与存储。
- 外设 是计算机与外部世界交互的工具,例如键盘、打印机和磁盘等。它们接收来自 CPU 的输出(如打印任务),也能将物理信号(如按键动作)转换为数字信号传递给 CPU。
- I/O 接口 是连接 主机 与 外设 之间信息传输的桥梁,负责协调两者之间的同步、速度匹配和数据格式转换等问题。它在结构上包含两个部分:
- 主机侧接口:作为 内部接口,通过系统总线与 CPU 和 主存(内存)连接;
- CPU ↔ 设备控制器:通过系统内部总线(如 PCI、PCIe)进行连接
- 外设侧接口:作为 外部接口,通过 USB、串口、并口等电缆与具体 外设 连接。
- 设备控制器 ↔ 外设:通过各种外部接口标准(如 USB、SATA、HDMI、VGA 等)进行连接
- 主机侧接口:作为 内部接口,通过系统总线与 CPU 和 主存(内存)连接;
通过 I/O 接口,系统在 CPU、内存 和 外设 之间建立了一条高效的信息传输通路。这个通路大致如下:
I/O 接口 和 设备控制器 的关系
设备控制器更强调控制逻辑与功能;I/O 接口更强调连接位置与通信角色。两者其实并不是严格等同,但在很多场景下它们是同一个物理实体的不同视角。可以将 I/O 接口视为设备控制器的一部分。
现代架构
现代 I/O 硬件系统的架构更加复杂,这节不会直接考查,了解即可:
在现代系统中,CPU 本身集成了部分高速 I/O 控制逻辑(如 内存控制器、PCIe 控制器、DMI 接口等),而非核心的 I/O 控制被下放至 芯片组(PCH),也就是过去所谓的“南桥”。这将 CPU 从大量外围管理工作中解放出来,提升性能并降低功耗。
- CPU 内部
- 包含 内存控制器 和部分 PCIe 控制器
- 与 PCH 之间通过高速互连(如 DMI / Direct Media Interface)通信
- PCH(Platform Controller Hub)
- 管理几乎所有非高速设备(如 USB、SATA、音频、网卡等)
- 是现代主板上的中心管理芯片,连接大量外设控制器
硬件和软件层
上文提到的是 I/O 系统的 硬件层次,除了硬件部分,I/O 系统还包括一系列的 软件组件,用以管理和调度外设资源、提供抽象接口、增强设备的可用性和通用性。主要的 软件层次 如下:
- 用户层 I/O 软件
- 设备独立性软件
- 设备驱动程序
- 中断处理程序
软硬件协同使得 I/O 操作既可高效运行,又具有高度的可移植性和扩展性。操作系统通过抽象和分层,使得新的设备只需添加驱动程序即可兼容原有的 I/O 系统,而不需要修改上层软件。
I/O 接口
结构
- 数据缓冲:CPU 寄存器、主存 等主机部件的存取速度比外设快很多,因此为了速度匹配,可将数据提前存到 I/O 接口 中的数据缓冲区,用以中和高速系统组件和低速外部设备之间的速度差异
- 数据格式转换:主机和外设的数据格式不同,I/O 接口 提供数据格式的相互转换,如串并转换、数模转换等
- 控制和定时:为来自系统总线的控制信号和定时信号提供控制和定时逻辑,对内部资源及外设间动作的先后关系进行协调,并对数据通信过程进行控制
- 错误或状态检测:提供可以保存各种状态信息的状态寄存器,CPU 通过读取这些寄存器来了解接口和外设的出错情况或状态
- 与主机和设备通信:上述四个功能都必须通过主机与 I/O 接口之间和 I/O 接口 与 外设 之间的通信来完成
I/O 端口
I/O 端口(Input/Output Port)是指 I/O接口电路中,CPU可直接访问的寄存器。CPU通过向这些端口发送命令、读取状态或交换数据,来实现对外部设备的间接控制。I/O端口是连接主机与外设的 软件可编程窗口,是操作系统和设备驱动程序进行I/O操作的核心对象。
基本分类
根据寄存器所承担的功能不同,I/O端口通常分为以下三类:
- 数据端口:用于存放CPU与外设之间待传输的实际数据,可读可写。
- 状态端口:用于存放外设或接口自身的状态信息(如“忙/闲”“就绪/未就绪”),通常为只读。
- 控制端口:用于接收CPU发出的控制命令(如“启动”“停止”“复位”),通常为只写。
编址方式
为了方便 CPU 对于 I/O 端口的访问,需要对各个端口进行编号,每个端口对应一个端口地址。
编址方式主要分为 统一编址 和 独立编址 两种。
统一编址也叫做 内存映射 I/O(Memory-Mapped I/O,MMIO),具备如下特点:
- I/O 设备的寄存器 直接映射到内存地址空间,CPU 将设备寄存器当作普通内存来访问。
- CPU 使用普通的内存访问指令(如
MOV、LDR、STR等)即可完成读写,不需要专门的 I/O 指令。 - 优点是 统一寻址、编程方便、指令通用性强,但会占用一部分主存地址空间。
例如,假设某设备的控制寄存器映射到了地址 0xF0001000,CPU 可以像访问普通变量一样:
MOV EAX, [0xF0001000] ; 读取设备寄存器
MOV [0xF0001000], EBX ; 向设备寄存器写数据
实际上访问的是设备寄存器,而不是 RAM。
现代计算机(如 ARM、RISC-V、以及 x86 中的大多数 PCIe 设备)几乎都采用 MMIO。
独立编址独立编址也叫做 端口映射 I/O(Port-Mapped I/O,PMIO),具备如下特点:
- I/O 地址空间与内存地址空间 完全分离,CPU 维护一套独立的 I/O 地址。
- CPU 不能使用普通内存读写指令,而必须使用专门的
IN、OUT指令访问 I/O 端口。 - 每个设备被分配一组 固定的端口号,例如传统 PC 中:
- 键盘控制器:
0x60、0x64 - 串口 COM1:
0x3F8 - 并口 LPT1:
0x378
- 键盘控制器:
例如,在 x86 中读取键盘控制器的数据:
IN AL, 0x60 ; 从端口 0x60 读取一个字节
向串口发送一个字节:
OUT 0x3F8, AL ; 将 AL 中的数据写入串口
由于 IN/OUT 指令只能访问 I/O 端口,因此普通的内存地址不能使用这两条指令进行访问。
下表给出了 MMIO 和 PMIO 这两种方式的对比:
| 编址方式 | 别名 | 地址空间 | 访问方式 | 是否占用主存地址空间 | 是否使用 IN/OUT |
|---|---|---|---|---|---|
| 统一编址 | 内存映射 I/O(MMIO) | 与内存共享 | 普通内存读写指令(如 MOV) | ✅ 是 | ❌ 否 |
| 独立编址 | 端口映射 I/O(PMIO) | 独立 I/O 地址空间 | 专用 IN/OUT 指令 | ❌ 否 | ✅ 是 |
对于考研来说,核心掌握两点即可:
- MMIO:设备寄存器映射到内存地址空间,使用普通内存读写指令访问。
- PMIO:设备拥有独立的 I/O 地址空间,只能使用
IN/OUT等专用 I/O 指令访问。
现代处理器(如 ARM、RISC-V)几乎只支持 MMIO;而传统 x86 为了兼容早期 PC,至今仍同时支持 MMIO 和 PMIO。
I/O 方式
I/O 设备的速度通常远低于 CPU,如果 CPU 一直等待设备完成操作,将会造成大量时间浪费。
因此,操作系统和硬件提供了多种 I/O 方式,核心目的都是:
- 协调 CPU 与 I/O 设备之间的速度差异;
- 尽可能减少 CPU 等待 I/O 的时间,提高系统整体效率。
根据 CPU 在数据传输过程中参与程度 的不同,常见的 I/O 方式可分为四种:
| I/O 方式 | CPU 是否负责数据搬运 | CPU 是否需要等待设备 | 特点 |
|---|---|---|---|
| 程序查询方式 | ✅ | ✅ 不断轮询) | 实现最简单,但 CPU 利用率最低 |
| 程序中断方式 | ✅ | ❌ | 设备完成后主动通知 CPU |
| DMA 方式 | ❌(DMA 控制器负责) | ❌ | CPU 只负责初始化,效率高 |
| 通道方式 | ❌(通道负责) | ❌ | 大型计算机使用,可管理多个设备 |
下面分别介绍这四种 I/O 方式。
程序查询方式
程序查询方式不断轮询设备状态以判断其是否可以进行数据传输,数据从 设备 → CPU → 主存。
程序查询方式包含以下步骤:
- 查询:CPU 定期查询或检查 I/O 设备的状态寄存器,查看设备是否准备就绪。
- 判断:如果设备未就绪,CPU 会继续执行其他任务或持续轮询;如果设备就绪,则进行数据传输。
- 数据传输:CPU 直接与 I/O 设备交换数据,可以是读操作或写操作。
- 结束:数据传输完成后,CPU 继续执行其他任务,同时继续轮询 I/O 设备状态。
程序中断方式
在程序中断方式中,当 I/O 设备 准备好 进行数据传输时,会触发一个 中断 来通知 CPU。CPU 会暂停当前正在执行的任务,处理中断,然后恢复执行被中断的任务。
相比于轮询方式,CPU 在执行程序中断之前不需要一直检查 I/O 设备的状态,这提升了效率。
DMA 方式
DMA(Direct Memory Access,直接内存访问)是一种计算机系统的 I/O(输入/输出)方式,它允许 外部设备直接与主内存交换数据,而无需 CPU 在数据传输过程中逐次参与。
有了上面的 程序中断方式,虽然在 一定程度上 实现了 CPU 和外设的并行工作,但这种并行并不彻底。CPU 只是在外设准备数据期间可以继续执行其他程序,而当外设完成一次数据准备后,仍需响应中断,进入中断服务程序,将数据从 I/O 接口寄存器 搬运到 主存。
由于一次中断通常只能完成少量数据的传输,因此面对高速 I/O 设备或大量数据传输时,CPU 需要频繁地暂停现行程序,不断进入中断服务程序完成数据搬运。这不仅增加了中断处理的开销,也使 CPU 花费大量时间充当 数据搬运者,影响了系统的整体性能。
DMA 方式正是为了解决程序中断方式的这一缺陷而提出的。它通过增加 DMA 控制器(DMA Controller),使数据能够直接在 I/O 接口 和 主存 之间传输,CPU 只需在传输开始前完成参数配置,在整个数据传输过程中无需参与具体的数据搬运,仅在传输结束后接收一次完成中断即可。因此,DMA 不仅实现了 数据传输过程与主程序真正并行工作,还大幅减少了 CPU 的数据搬运开销和中断次数,从而显著提高了高速、大批量数据传输的效率。
原理
DMA 让数据传送直接在 外设和内存之间 开辟一条 数据通路,使得数据传送期间不再需要占用 CPU 时间处理中断、保护断点和恢复 CPU 现场等繁琐操作。
在 DMA 方式中,CPU 只参与预处理(CPU 通过初始化程序来设置 DMA 控制器的各参数寄存器的初始值,如内存首地址、字计数值等)和后处理过程(传送完成后 CPU 会进行数据校验等工作)。通常适用于以块读写的设备。
这意味着在 DMA 方式下,CPU 的核心计算资源几乎不受数据传输的影响。
通过 DMA 方式,外设和内存之间进行数据传输是否还需要经过 CPU?
外设写入内存时,数据“绕过了 CPU 的寄存器和执行单元”,但仍然必须“经过 CPU 芯片内部的互连与 内存控制器”来完成写入,整个过程由 CPU 授权和调度,不占用 CPU 核心计算资源。
比如我们通过下表对该过程进行 更加精细化的分解 🔍 :
| 层次 | 是否经过 | 说明 |
|---|---|---|
| CPU 的 寄存器 / 执行单元 | ❌ 否 | DMA 不用 CPU 寄存器搬数据,也不打断指令流 |
| CPU 的 互连结构(SoC Fabric) | ✅ 是 | 所有 I/O 访问在 CPU 芯片内都要通过互连 |
| CPU 的 内存控制器(IMC) | ✅ 是 | 最终访问内存必须经过内存控制器,现代 CPU 内部集成 |
| CPU 的 授权 / 控制路径 | ✅ 是 | DMA 之前需配置地址、长度、权限等控制结构 |
DMA 控制器
DMA 控制器是实现 DMA 传输的专用硬件,其主要负责接收 CPU 的配置、申请系统总线控制权,并在 I/O 接口 与 主存 之间自动完成数据传输。其主要组成如下:
- 主机 - 控制器接口
- DR(数据寄存器):暂存一次总线传输的数据。
- MAR(内存地址寄存器):保存当前主存地址,每完成一次数据传输后自动更新。
- DC(数据计数器):记录剩余待传输的数据量,每完成一次数据传输后自动递减。
- CR(命令/状态寄存器):保存 CPU 配置的 DMA 工作参数(如传输方向、工作方式等),同时记录 DMA 的工作状态。
- I/O 控制逻辑
- 块设备 - 控制器接口
教材中常说 DMA 以"块"为单位进行传输,这里的"块"并不是指 DMA 在一次总线周期内就传输完整块数据。实际上,DMA 底层仍然按照总线传输单位(如字节、字、Cache Line 等)逐次完成数据交换,每完成一次传输都会自动更新 MAR 和 DC。所谓"块传输",是指 CPU 只需配置一次 DMA 控制器,DMA 便能够自动、连续地完成整块数据的传输,而无需 CPU 在每次数据搬运时参与。
举个例子,对于 MAR = 0x100000,DC = 4096,那么 DMA 的逻辑就类似于以下代码描述的流程:
while (DC > 0) {
搬一个总线传输单位;
MAR += unit;
DC -= unit;
}
当 DC 减到 0 时,DMA 传输结束,通过一个中断告诉 CPU 传输完成。
DMA 控制器和 CPU 的关系
上图展示的是早期计算机系统中的一种典型实现。在传统的单总线结构中,DMA 控制器(DMAC) 是一个独立于 CPU 的硬件模块,通过系统总线连接主存和 I/O 控制器。当需要进行 DMA 传输时,DMA 控制器首先向 CPU 申请系统总线的控制权,随后接管总线,在 I/O 接口 与 主存 之间直接完成数据传输。
现代计算机中,DMA 功能通常已经集成到 CPU、芯片组(PCH)、I/O 控制器,甚至 PCIe 网卡、SSD、GPU 等高速设备内部,因此现代系统更多是集成的 DMA 引擎(DMA Engine),而不是独立的 DMA 芯片。不过,它们的工作原理与早期 DMA 控制器基本一致。
步骤
DMA 方式与中断 I/O 方式都采用“请求—响应”的工作机制,但二者请求的对象不同:
- 中断 I/O 方式请求 CPU 暂停当前程序,进入中断服务程序处理数据传输。
- DMA 方式主要请求系统总线的控制权,由 DMA 控制器代替 CPU 完成外设与主存之间的数据传输。
如下图所示,为进程 P1 通过 DMA 在磁盘和主存之间进行数据交换的过程:
一次完整的 DMA 传输通常可以分为 预处理、数据传输和后处理 三个阶段。
预处理
CPU 首先对 DMA 控制器进行初始化,设置本次传输所需的参数,主要包括:
- 外设地址或 I/O 接口地址;
- 主存起始地址;
- 数据传输长度;
- 数据传输方向;
- DMA 的工作方式。
设置完成后,CPU 启动外设和 DMA 控制器,随后便可以继续执行其他程序。
DMA 请求
当外设准备好数据,或者具备接收数据的条件后,外设向 DMA 控制器发出 DMA 请求。
DMA 控制器接收到请求后,向 CPU 或总线仲裁器申请获得系统总线的控制权。
取得总线控制权
CPU 在完成当前总线周期后,向 DMA 控制器发出总线响应信号,并暂时让出总线控制权。
DMA 控制器取得总线控制权后,开始执行 DMA 传输周期。
数据传输
DMA 控制器直接在 I/O 接口和主存 之间传输数据,不需要 CPU 逐次参与数据搬运。
每传输一个数据单位,DMA 控制器通常会自动:
- 修改主存地址;
- 更新传输计数;
- 判断本次传输是否已经完成。
在 DMA 传输期间,CPU 仍可继续执行不依赖该总线的操作;当 CPU 与 DMA 控制器同时需要使用总线时,需要通过总线仲裁决定使用权。
释放总线控制权
当规定数量的数据全部传输完成后,DMA 控制器结束 DMA 操作,并释放系统总线,使总线控制权重新交还给 CPU。
后处理
DMA 传输完成后,DMA 控制器通常向 CPU 发出一次 完成中断。
CPU 响应中断后进入相应的中断服务程序,完成后续处理,例如:
- 检查 DMA 传输是否成功;
- 读取并清除 DMA 状态;
- 更新进程或 I/O 请求的状态;
- 唤醒等待数据传输完成的进程;
- 启动下一次 I/O 操作。
因此,在 DMA 方式下,CPU 主要负责传输前的初始化和传输后的处理,而大批量数据的实际搬运由 DMA 控制器完成。
使用总线方式
在 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 控制器可以优先获得总线使用权:
因为磁盘一旦开始读写,就必须按时完成数据传送,否则数据缓冲区中的数据会发生丢失。
通道方式
通道方式(Channel I/O)是在 DMA 的基础上进一步发展而来的 I/O 方式,主要用于大型机和早期高性能计算机。
DMA 方式虽然能够实现 设备与主存之间直接传输数据,但 每完成一次 DMA 传输,CPU 都需要重新启动下一次 DMA 操作。当系统同时管理大量高速 I/O 设备时,CPU 仍需要频繁参与各个 DMA 的初始化工作。
为了解决这一问题,引入了 通道(Channel)。
通道本质上是一种 专门负责 I/O 的处理器(又称 I/O Processor),能够独立执行一系列 I/O 指令,因此也称为 通道处理机。
CPU 只需向通道下达一次 I/O 命令,之后整个 I/O 过程都由通道负责完成,无需 CPU 再参与具体的数据传输和设备控制。
因此,数据传输路径变为:设备 ↔︎ 通道 ↔︎ 主存
CPU 与通道之间仅交换控制信息,而数据在设备和主存之间直接传输。
工作过程
通道方式通常包含以下几个步骤:
- CPU 初始化:CPU 将通道程序(Channel Program)的首地址告诉通道,并启动通道工作。
- 通道执行:通道依次执行通道程序中的各条 I/O 指令,自动控制设备完成数据传输。
- 数据传输:数据直接在 设备 ↔ 主存 之间传输,不经过 CPU。
- 结束中断:整个 I/O 操作完成后,通道向 CPU 发出中断,通知任务结束。
整个过程中,CPU 可以一直执行其他程序,只需在开始和结束时参与。
通道程序
通道程序(Channel Program)是一组存放在主存中的 通道指令。
这些指令规定了:
- 操作哪个设备;
- 数据存放的位置;
- 数据传输长度;
- 下一条通道指令的位置等。
CPU 不负责执行这些指令,而是由 通道 独立解释和执行。
通道与 DMA 的区别
| 比较项 | DMA | 通道 |
|---|---|---|
| 控制者 | DMA 控制器 | 通道(I/O 处理机) |
| 是否具有执行指令能力 | ❌ 没有 | ✅ 有,可执行通道程序 |
| CPU 参与程度 | 每次 DMA 都需 CPU 初始化 | CPU 只需启动一次通道程序 |
| 能否管理多个设备 | 一般较弱 | ✅ 可以同时管理多个设备 |
| 应用场景 | 微机、PC、服务器 | 大型机、高性能计算机 |
四种 I/O 方式可以理解为 CPU 参与程度逐渐降低的过程:
- 程序查询:CPU 负责等待 + 数据搬运。
- 程序中断:CPU 不等待,但仍负责数据搬运。
- DMA:CPU 不等待,也不负责数据搬运,只负责初始化 DMA。
- 通道:CPU 连 DMA 的启动细节都交给通道,只负责下达 I/O 任务。