# 总线
## 总线
- 总线的基本概念
- 总线的组成和性能指标
- 总线事务和定时
## I/O接口
- I/O接口的功能和基本结构
- I/O端口和编址
## I/O方式
- 程序查询方式
- 程序中断方式
- DMA方式
总线和输入输出系统
1 - 总线
总线概念
总线 是一组电子导线或信号线,它们允许不同的硬件设备(如 CPU、内存、输入/输出 设备等)之间进行数据传输和通信。总线是计算机内部和外部设备之间的信息传递通道。
总线类型
功能
- 核内总线 :在处理器核内部各元件之间连线的总线称为 核内总线 ,可连接核内各寄存器、ALU、指令部件等
- 系统总线 :指连接 CPU、主存和 I/O 接口等主要部件的总线,通常所说的总线是指这类在系统主要模块之间互连的总线。下面要介绍的也是这种 系统总线 。
- 通信总线 :计算机系统之间或计算机系统与其他系统(远程通信设备、测试设备)之间进行通信的总线,又称 外部总线。
数据传送方式
总线 的数据传输方式包含 串行 和 并行 两种:
- 串行总线 :只含有一条双向数据线或两条单向数据线,数据按位分时传送。适合远距离通信,大多数 通信总线 属于 串行总线
- 并行总线 :含有多条双向数据线,可实现多位同时传送。传输效率高,但相邻数据线之间会相互干扰,适合近距离传输。大多数 系统总线 属于 并行总线
试题中常常考查 哪些总线是串行总线,哪些总线是并行总线 。
这里核心把握一点:现代高速通信几乎都使用串行总线(PCIe、USB、SATA、DisplayPort),而并行总线主要用于内存、老式设备或非常短距离的高速通信。
常见的串行总线 如下表所示:
| 总线类型 | 简介 |
|---|---|
| USB(通用串行总线) | 广泛用于外设连接,如鼠标、键盘、U盘。支持热插拔。 |
| 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 通信;
- 这些设备不要求极高带宽,通过桥接方式集中管理,可简化主板设计并降低成本。
总线组成
系统总线 通常由一组控制线、一组数据线和一组地址线构成。也有些总线没有单独的地址线,即数据线和地址线 复用。
- 数据总线(Data Bus) :数据总线用于在计算机系统的各个组件之间 传输数据。它通常由多条并行线组成,每条线传输一个数据位(比特)。
- 位数(数据总线条数)与机器字长、存储字长有关,一般是 8 位、16 位、32 位
- 地址总线(Address Bus) :地址总线用于传输 内存地址 或外部设备的地址信息,以确定数据的存储位置或目标设备。
- 地址总线的宽度决定了系统可以寻址的内存或设备的数量。更宽的地址总线通常允许系统寻址更多的内存或设备。
- 控制总线(Control Bus) :控制总线传输 控制信号和命令,用于控制各个硬件组件的操作。这些控制信号包括读/写信号、时钟信号、中断信号、复位信号等。控制总线用于协调数据传输和操作的序列。
总线组成和总线架构的关系 :
- 在 单总线架构 中,所有的通信—包括数据、地址和控制信息—都通过同一个物理总线传输。这意味着数据总线、地址总线和控制总线的功能在一个共享的通道上实现。
- 在 多总线架构 中,数据总线、地址总线和控制总线可能会分别拥有独立的物理通道,或者系统中可能存在专门的总线来处理不同类型的数据流。
总线指标
时钟频率 指总线所依赖的时钟信号的频率。它表示的是“时钟脉冲”产生的快慢。
时钟频率 单位 为 Hz,常见如 100MHz、133MHz 等。
总线传输周期总线传输周期 指一次完成总线数据传输所需的时间,包括申请、寻址、传输和结束阶段。
一个完整的传输周期可能需要 多个时钟周期。
总线工作频率工作频率 指总线 实际传输数据 的频率。
一般来说,工作频率与时钟频率相同,但有些总线为了提高带宽,会采用 倍频/分频 机制:
- SDR(单倍数据率):每个时钟周期只在一个边沿传输数据,工作频率 = 时钟频率。
- DDR(双倍数据率):在上升沿和下降沿各传输一次,工作频率 = 2 × 时钟频率。
- QDR(四倍数据率):一个周期传四次,工作频率 = 4 × 时钟频率。
更加泛化地说,若总线传输周期 = N 个时钟周期,则总线的工作频率 = 时钟频率 / N。
总线宽度 也叫做总线位宽,是总线上 能同时传输的数据位数,通常指的是数据总线的根数,如 32 根称为 32 位总线。
总线带宽总线带宽 指单位时间内总线能传输的最大数据量,通常用 MB/s、GB/s 表示,计算公式为:
常见总线标准
需要熟练掌握一些会考察的 总线标准 的名称:PCI、SATA、ISA、IDE、USB,并且能够和其他计算机领域的专业名词区分开来:
- PCI :PCI 总线 是一种用于连接内部扩展卡(如显卡、网卡、声卡等)到主板的标准。PCI 总线 存在多个版本,包括 PCI、PCI-X 和 PCI Express(PCIe),它们在带宽、速度和适用范围上有所不同。
- SATA :SATA 是一种用于连接存储设备(如硬盘驱动器和光盘驱动器)到计算机的总线标准。它广泛应用于个人电脑和服务器中。
- ISA :16 位体系结构,只能支持 16 位的 I/O 设备,是已经被淘汰的插槽接口。
- IDE :IDE 是早期计算机中用于连接硬盘驱动器和光盘驱动器的 总线 标准,现在已经被 SATA 所取代。
- USB :USB 是一种通用的总线标准,用于连接各种外部设备(如键盘、鼠标、打印机、存储设备等)到计算机。USB 有多个版本,包括 USB 1.0、USB 2.0、USB 3.0、USB 3.1 和 USB 3.2,它们在传输速度和功能上有所区别。
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)仅仅是协议。
总线事务
总线事务 是计算机总线操作的一个 基本单位。一个总线事务通常涉及一系列的操作,这些操作可以是数据的读取或写入。
在一个总线事务中,主设备(发起事务的设备)通过总线控制线对总线进行控制,并发出地址和数据,以及读写信号。从设备(数据被读取或写入的设备)则识别地址,并根据读写信号进行相应的数据交换。
总线事务 包含几个主要阶段:
- 请求(Request) :主设备发出 总线传输请求。
- 仲裁(Arbitration) :如果多个设备同时尝试使用总线,它们必须通过某种仲裁过程来 决定哪个设备有权 控制总线。这通常涉及一个优先级方案,以防止冲突和数据损坏。
- 寻址(Addressing) :主设备将 目标地址 放在总线上,以指定事务的目的地,如特定的内存地址或 I/O 设备。
- 传输(Transfer) :一旦地址被确认,数据传输就会发生。这可以是读操作,也可以是写操作。
- 终止(Termination) :一旦数据成功传输,事务就会结束。终止阶段可能包括从设备发出的确认信号,或者主设备撤销其对总线的控制。
突发总线传输事务
突发(Burst)总线传输事务 是指在总线通信中,主设备(如 CPU 或 DMA 控制器)发起一次总线请求后,在无需为每个数据单元单独进行地址仲裁或握手的情况下,连续传输多个数据单元(通常是字节或字)。这种传输方式的核心优势在于:
- 减少地址/控制总线占用:传统单次传输中,每次传输都需要发送地址和控制信号。突发传输仅在开始时发送一次起始地址,后续数据单元通过自动递增地址或固定地址模式连续传输,显著减少了总线控制开销。
- 提高总线带宽利用率:由于减少了握手和地址传送的等待时间,总线在数据传输阶段保持活跃,从而提升了有效数据传输速率。
- 适用于块数据传输:如高速缓存行填充、内存块拷贝、DMA 数据搬迁等场景,突发传输尤其高效。
总线周期
总线周期 是指 CPU 通过 总线 与存储器或 I/O 接口进行一次数据传输所需的时间。
一个 总线周期 通常包含多个时钟周期,这些时钟周期可以被分为四个阶段(四个时钟周期
):
- 申请分配阶段:主设备进行请求和仲裁。
- 寻址阶段:主设备用地址信息来指明它想读/写的那个从设备是哪一个。
- 传输阶段:主设备向从设备发出读命令或者写命令。
- 结束阶段:主设备把地址信息、读写命令等从 总线 撤除,让出 总线 的使用权。
总线定时
根据 时钟周期 一节可知,计算机中的设备也许并不使用相同的时钟周期,但是设备间在交换数据的过程中需要时间上配合。
这种时间配合的控制过程就叫做 总线定时,总线定时 包含 同步定时 和 异步定时 两种方式。
同步定时方式
在 同步定时方式 中,数据传输的时钟信号由一个 中央时钟源(通常是主时钟源或总线控制器)生成,并将时钟信号传送到所有参与通信的设备。
这个时钟信号每次都产生一个相等的时间间隔,这个间隔为一个 总线传输周期,主设备和从设备必须在这个限定的时间内完成规定的操作。
- 的上升沿到来时,主模块向从模块发送地址
- 的上升沿到来时,主模块发送读命令
- 的上升沿到来时,从模块提供数据
- 的上升沿到来时,主模块撤销读命令,从模块撤销数据
同步通信适用于总线长度较短(出现信息错误的概率小)及总线所接部件的存取时间比较接近的系统。
如果有的从设备速度较慢,就会跟不上总线的节奏,进而拖慢了主设备的速度。
异步定时方式
在 异步定时方式 中,数据传输的时钟信号不是由中央时钟源统一控制,而是由每个设备自己的时钟信号驱动。完全依靠传送双方相互制约的“握手”信号来实现定时控制,通常我们将交换信息的两个设备称为主设备和从设备,主设备发送“请求”,从设备接收到后回复“回答”。
异步定时 根据“请求”和“回答”的类型,可以分为三种类型:
- 不互锁 :主设备持续发送请求一段时间,默认从设备接收到请求。
- 半互锁 :主设备接收到来自从设备的回答后停止发送请求,从设备发送回答一段时间,默认主设备接收到回答。
- 全互锁 :从 半互锁 的基础上,从设备接收到来自于主设备的回答后停止发送回答。
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 任务。