I/O 设备

image-20260622155929659

1. 块设备

  • 单位:固定大小(512B~64KB),可随机寻址、独立读写单块
  • 实例:HDD/SSD、U 盘、蓝光光盘
  • 优点:批量传输大数据效率高;引脚少
  • 缺点:修改块内少量数据,必须整块读入内存修改、再整块写回,小数据性能损耗 块设备慢

2. 字符设备

  • 单位:单个字符,字节流串行传输,不可寻址,无块结构
  • 实例:键盘、鼠标、打印机、网卡、串口
  • 特点:连续数据流处理灵活,无需寻道

设备控制器

image-20260622160018751

image-20260622160106077

  1. 定位

CPU ↔ 控制器 ↔ I/O 设备,硬件芯片,配套软件为设备驱动

  1. 内部核心寄存器(CPU 交互接口)

image-20260622160218260

  1. 数据寄存器:缓存 CPU 与设备传输的数据

  2. 控制寄存器:CPU 下发读写、格式化等指令

  3. 状态寄存器:设备忙 / 就绪 / 故障状态,CPU 读取判断

  4. 核心工作

  • 串并数据转换、硬件错误校验(ECC)、本地缓冲数据、中断协调 CPU
  • 一块控制器可管理多个同类型外设(最多 8 个)
  1. 计算机硬件层级

image-20260622160202438

CPU (MMU) → 总线 → 各类控制器(硬盘 / USB / 视频 / 键盘)→ 外设

映射 I/O

方式 1:端口映射 I/O(隔离 I/O,x86 原生)

image-20260622161118592

  1. 地址空间:内存、I/O 端口是两个完全独立地址空间,互不重叠
  2. 指令:专用 IO 指令 IN(读端口)、OUT(写端口),普通MOV无法访问端口
  3. 特点:硬件独立控制线区分内存 / IO 访问;隔离性强、冲突少;高级语言要内嵌汇编操作 IO
  4. 代表架构:x86(0~64K 为独立 IO 端口空间)

方式 2:内存映射 I/O(MMIO,主流通用)

  1. 地址空间:内存与 I/O 寄存器共享同一个地址空间,外设寄存器占用一段物理内存高端地址
  2. 指令:普通内存读写指令(MOV等)即可操作设备,无特殊 IO 指令
  3. 优点:编程简单(C 语言指针直接访问)、统一指令、安全机制依托虚拟内存权限控制
  4. 缺点:内存缓存会造成缓存一致性问题(寄存器实时状态被缓存干扰),硬件需对 IO 地址页禁用缓存;单地址空间所有模块均校验地址,系统开销大
  5. 代表架构:PDP-11、ARM、多数嵌入式设备

混合方案(x86 实际使用)

控制寄存器走独立 IO 端口;大批量数据缓冲区采用 MMIO 映射,兼顾两者优势。

总线结构

image-20260622161321101

单总线:CPU、内存、所有 I/O 共享一条总线,所有设备校验每一条地址,效率低

image-20260622161338175

现代 PC 架构:专用高速内存总线 + PCIe 外设总线(SATA/USB/ 网口挂在平台控制器 PCIe 插槽)

高速内存总线:CPU 内核 / 缓存 ↔ 内存控制器 ↔ DDR 内存,专供内存高速访问

PCIe 外设总线(平台控制器 PCH):挂载 SATA 硬盘、USB、网卡、显卡、PCIe 插槽

单总线缺陷:所有设备争抢同一总线,地址匹配开销大;现代机拆分专用总线提升效率

MMIO 多总线寻址 3 种方案

方案逻辑优缺点
顺序总线访问先发内存总线请求,失败再切 I/O 总线实现简单,多次切换总线性能差
探查设备法总线上硬件监控 I/O 地址,直接转发请求I/O 设备速度慢,易形成性能瓶颈
地址过滤法内存控制器预存内存 / I/O 地址区间效率高,但系统初始化配置复杂,配置错误会地址错乱

DMA 直接内存访问

image-20260622161617047

DMA方式的工作原理:
一个设备接口试图通过总线直接向另一个设备发送数据(一般是大批量的数据),它会先向CPU发送DMA请求信号。外设通过DMA的一种专门接口电路――DMA控制器(DMAC),向CPU提出接管总线控制权的总线请求,
CPU收到该信号后,在当前的总线周期结束后,会按DMA信号的优先级和提出DMA请求的先后顺序响应DMA信号。CPU对某个设备接口响应DMA请求时,会让出总线控制权。于是在DMA控制器的管理下,外设和存储器直接
进行数据交换,而不需CPU干预。数据传送完毕后,设备接口会向CPU发送DMA结束信号,交还总线控制权。
实现DMA传送的基本操作如下:
(1)外设可通过DMA控制器向CPU发出DMA请求:
(2)CPU响应DMA请求,系统转变为DMA工作方式,并把总线控制权交给DMA控制器;
(3)由DMA控制器发送存储器地址,并决定传送数据块的长度;
(4)执行DMA传送;
(5)DMA操作结束,并把总线控制权交还CPU。
用途:
DMA方式主要适用于一些高速的I/O设备。这些设备传输字节或字的速度非常快。对于这类高速I/O设备,如果
用输入输出指令或采用中断的方法来传输字节信息,会大量占用CPU的时间,同时也容易造成数据的丢失。而
DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。

无 DMA 传统传输(中断驱动):设备每读取 1 字节就触发中断,CPU 逐字节搬运数据;大批量 I/O 时 CPU 完全被占用,效率极低。

DMA 控制器独立抢占总线,外设 ↔ 内存直接批量传输,全程无需 CPU 逐字节干预,仅初始化和传输结束时占用 CPU。

DMA 三传输模式

周期窃取(每次一字)

DMA 每次只传 1 个字就释放总线;CPU 可穿插使用总线,延迟小;频繁切换总线有开销。

突发块模式(块传输)

DMA 一次性占用总线传完整块,总线利用率高;缺点:长时间霸占总线,CPU / 其他外设阻塞。

飞越式(fly-by)

数据不经过 DMA 内部缓存,外设直接写入内存,总线开销最低;与之相对的是 “先传至 DMA 缓存再转发”,灵活性更强(支持内存互拷)。

中断

image-20260622162451967

完整中断流程

  1. I/O 设备完成任务 → 设备控制器发送中断信号给中断控制器
  2. 中断控制器按优先级排队、仲裁,向 CPU 发中断请求
  3. CPU 保存现场(PC 程序计数器、PSW 程序状态字、通用寄存器),压栈保存
  4. CPU 跳转至中断向量表对应中断服务程序处理设备
  5. 处理完毕,恢复寄存器与 PC,回到被打断程序继续执行

中断向量表:存储每个中断对应的服务程序入口地址,可硬件固定 / 内存动态分配

中断控制器:集中管理所有外设中断,优先级调度、屏蔽中断、确认中断完成

陷阱 (trap):软件主动触发中断,和硬件外设中断共用同一套向量处理逻辑

精确 / 不精确中断

流水线 / 超标量 CPU :中断触发时,流水线存在多条处于不同执行阶段的指令(部分完成、部分未启动);单纯依靠 PC 无法准确区分已执行 / 未执行指令,直接恢复会导致逻辑错误。

精确中断

image-20260622165118635

PC 保存位置固定,中断后可精准恢复执行点

PC 指向指令之前所有指令全部执行完毕,状态已写入处理器

PC 指向指令之后所有指令完全未启动

PC 当前指令执行状态完整可记录,可决定重跑 / 跳过

满足以上 4 点,中断前后系统状态一致,无逻辑错乱。

不精确中断

image-20260622165125370

不满足任意一条精确中断规则;流水线内指令执行进度混乱,恢复现场无法保证程序正确性,硬件设计尽量规避。

I/O 软件原理

核心设计目标

1 设备独立性

image-20260622172720268

定义应用程序代码无需绑定具体硬件,一套代码可操作硬盘、U 盘、DVD、键盘等不同设备。

实现手段:统一命名

Unix/Linux 把所有外设映射成文件,用统一文件路径访问(如/dev/sda硬盘);上层读写文件接口完全一致,屏蔽底层硬件差异。

例子sort命令输入可接键盘 / 磁盘,输出可存硬盘 / 打印屏幕,无需修改程序。

作用:程序可移植、开发简化、用户不用记忆硬件专有指令。

  1. 分层错误处理

错误自底向上逐级处理:设备控制器自检修复 → 驱动程序重试 → OS / 应用层兜底

上层不用关心底层故障细节,屏蔽硬件异常细节,提升系统稳定性。

  1. 同步 / 异步(中断驱动)传输分离

    image-20260622172746224

同步 I/O:CPU 发起 I/O 后阻塞等待传输完成,全程不执行其他任务。

异步 I/O(中断驱动):CPU 下发指令后立刻切换执行其他任务;设备完成后发中断通知 CPU 处理,CPU 利用率高,现代系统默认方案。

  1. 缓冲

核心作用:平衡高速 CPU / 内存与低速外设的速率差,避免数据丢失、平滑流量。

底层逻辑:数据不直接跨设备直传,先放入缓冲区中转。

5.共享和独占

独占设备:物理上只能一人用,靠 SPOOL 实现多进程共享使用;

共享设备:天然支持多进程并发读写,磁盘是典型代表;

IO 软件核心任务:对两类设备做访问协调,避免数据混乱、提升硬件利用率。

I/O 控制方式

驱动软件操控硬件 IO 的三种底层方案

方式 1:程序控制 I/O轮询 / 忙等 Polling)

image-20260622172958731

流程:CPU 发 I/O 指令 → 循环反复读取设备状态位,直到操作完成,全程占用 CPU。

缺点:CPU 持续空转,资源浪费,低速设备场景性能极差。

适用场景:I/O 等待时间极短、低成本嵌入式设备。

核心特征:无中断机制,设备不会主动通知 CPU。

方式 2:中断驱动 I/O

image-20260622173021933

流程:CPU 发起 I/O → 转去运行其他程序;设备完成后主动发中断;CPU 保存现场、进入中断服务程序搬运数据。

优点:CPU 等待期间可并行处理任务,大幅提升利用率。

缺点:大批量数据传输时,每传 1 字节触发一次中断,频繁中断 + 逐字节拷贝消耗 CPU。

适用场景:键盘、鼠标等少量字符低速设备。

方式 3:DMA 直接内存访问

流程:CPU 仅初始化 DMA 寄存器(内存地址、传输长度);DMA 控制器接管总线,外设与内存直接批量传输;传输结束仅触发一次中断。

优点:大批量数据几乎无需 CPU 参与,硬盘、SSD 高速块设备标配。

三者递进关系

轮询 → 引入中断解决 CPU 忙等 → 引入 DMA 解决大批量逐字节中断开销

控制方式CPU 参与度中断次数适用设备性能优劣
轮询全程占用极短耗时小型设备最差
中断驱动仅初始化 + 收尾,逐字节搬运每个数据一次中断键盘、鼠标字符设备中等
DMA仅初始化 + 传输完成一次中断整块数据仅 1 次中断硬盘、U 盘块设备最优

常见的IO模型

1. 阻塞模型
2. 非阻塞模型
3. IO复用模型
4. 信号模型
5. 异步IO模型

I/O 层次结构

image-20260623155615891

中断处理程序

中断处理程序又称中断服务程序(ISR),是 I/O 四层软件里最底层,软硬件交互的底层接口;

触发来源:硬件中断、软件中断、程序异常;

核心作用:硬件 I/O 完成后通知 CPU,完成软硬件模式切换,唤醒阻塞的驱动 / 进程,处理硬件中断事件。

核心收尾逻辑:中断处理完成后,需要唤醒等待该 I/O 的阻塞线程,提供 3 种标准唤醒机制:

  • 信号量机制:执行up释放信号量,唤醒阻塞线程,多用于多线程资源等待;
  • 管程机制:执行signal操作,生产者消费者模型典型用法;
  • 消息传递机制:发送消息通知恢复运行,多用于分布式、微服务进程通信。
类型核心特点适用场景
非嵌套中断处理中断时屏蔽所有新中断,串行处理,逻辑最简单简单单片机、单外设小型设备
嵌套中断仅屏蔽同 / 低优先级中断,高优先级中断可抢占当前中断,实时性强实时控制系统、工业控制器
可重入中断多线程可同时调用同一段 ISR,使用局部变量、锁保护共享资源多任务并发操作系统
简单优先级中断仅划分少量优先级,无复杂分组简易小型嵌入式设备
标准优先级中断精细划分多级优先级,高优中断可打断低优中断复杂网关、通信设备
高优先级中断极高响应时效,优先抢占执行飞行器、传感器安全控制
优先级分组中断中断分组管理,组内定义抢占规则,兼顾公平与速度多媒体播放器、复杂桌面系统

中断处理 10 大完整流程

image-20260623155806986

1保存寄存器状态:保存 PC、通用寄存器等硬件未自动保存内容,防止原进程数据丢失;
2设置 ISR 上下文:配置 TLB、MMU、页表,保证中断程序在内核合法地址空间运行;
3分配独立栈空间:给中断程序分配专属栈,避免和用户进程栈冲突;
4响应中断控制器:向中断芯片发送 EOI 应答信号,确认收到本次中断;
5恢复进程上下文备份:把寄存器存入进程表,暂存原进程运行环境;
6执行中断服务程序:读取设备控制器寄存器,处理本次 I/O 中断(读键盘、硬盘数据等);
7调度选择新进程:若中断唤醒了更高优先级就绪进程,优先调度高优进程;
8为新进程配置 MMU 页表:切换虚拟内存映射,适配新进程地址空间;
9加载新进程寄存器:将 PC、SP、PSW 等寄存器替换为新进程上下文;
10运行新进程:CPU 跳转执行新进程第一条指令。

设备驱动程序

image-20260623155950975

定义:设备驱动程序是衔接操作系统与设备控制器的专用程序,负责将上层通用 I/O 请求,翻译成控制器寄存器可识别的硬件指令,完成硬件读写控制。

两种运行模式

(1)内核态驱动(Linux/Windows 主流)

  • 运行在内核地址空间,直接访问硬件物理地址;

(2)用户态驱动(MINIX3 典型架构)

  • 驱动作为独立用户进程运行,不嵌入内核;用户进程发起 I/O 需通过系统调用中转内核;

设备驱动核心工作流程

接收上层 I/O 读写请求;校验设备状态:设备忙则请求入等待队列;空闲则继续执行;

设备初始化:启动电机、上电、自检,等待硬件就绪;

生成硬件指令序列,写入设备控制器寄存器;

控制器逐条执行指令,每执行一条校验确认;全部指令完成后触发硬件中断;

中断处理程序唤醒驱动,驱动校验传输数据,向上层返回操作结果。

与设备无关的 I/O 软件

核心定义:不绑定任何物理硬件,屏蔽底层设备差异,向上层应用提供统一、标准化的通用 I/O 接口,实现设备独立性

五大核心基础功能

缓冲管理

在内存开辟缓冲区暂存读写数据,消除 CPU 高速与外设低速的速度差,减少硬件访问次数、降低中断频次、提升系统吞吐。

统一错误报告

屏蔽不同硬件差异化报错逻辑,将底层硬件故障统一封装为标准错误码,简化上层程序开发。

设备驱动统一接口

为块设备、字符设备定义标准化调用规范,新增硬件只需适配驱动,无需修改内核上层逻辑。

设备分配与释放

管理独占型设备(打印机),实现互斥访问;提供两种处理策略:

  • 策略 1:设备被占用时直接返回失败;

  • 策略 2:请求进程阻塞等待,设备释放后自动唤醒;

维护设备等待队列,避免多进程资源抢占冲突。

屏蔽物理块大小差异

不同磁盘扇区大小不同,本层向上层提供统一逻辑块尺寸,应用无需关心底层硬件扇区规格。

缓冲三种实现模型

(1)无缓冲区模型(性能最差)

流程:每到达 1 个字符触发中断→唤醒用户进程→进程读取单字符后再次阻塞。

缺陷:频繁进程切换、大量 CPU 开销,用户进程长时间阻塞,系统性能损耗严重。

(2)单缓冲区模型(用户空间缓冲)

流程:中断持续写入用户缓冲区,缓冲区填满后统一唤醒进程,一次性读取批量数据。

优化:减少唤醒次数,但存在缺陷 —— 缓冲区填满前新数据无存储位置,易丢失字符。

(3)内核双缓冲模型(工业通用最优方案)

流程:

  1. 内核设置两块缓冲区,硬件数据先写入内核主缓冲;

  2. 主缓冲填满后,系统将数据拷贝至用户缓冲区;

  3. 拷贝期间新到达数据写入备用缓冲,主缓冲清空复用;

优势:无数据丢失,中断与用户进程读写并行,吞吐量大幅提升。

拓展:除双缓冲外,还有循环缓冲(环形缓冲区),适合流式持续数据收发。

用户空间的 I/O 软件

核心交互方式:依靠操作系统提供的系统调用完成内核请求,自身无法直接访问硬件寄存器。

附录

基本io层次结构没怎么听 磁盘 也没听 要期末复习了

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐