操作系统_输入输出
I/O 设备

1. 块设备
- 单位:固定大小块(512B~64KB),可随机寻址、独立读写单块
- 实例:HDD/SSD、U 盘、蓝光光盘
- 优点:批量传输大数据效率高;引脚少
- 缺点:修改块内少量数据,必须整块读入内存修改、再整块写回,小数据性能损耗 块设备慢
2. 字符设备
- 单位:单个字符,字节流串行传输,不可寻址,无块结构
- 实例:键盘、鼠标、打印机、网卡、串口
- 特点:连续数据流处理灵活,无需寻道
设备控制器


- 定位
CPU ↔ 控制器 ↔ I/O 设备,硬件芯片,配套软件为设备驱动
- 内部核心寄存器(CPU 交互接口)

-
数据寄存器:缓存 CPU 与设备传输的数据
-
控制寄存器:CPU 下发读写、格式化等指令
-
状态寄存器:设备忙 / 就绪 / 故障状态,CPU 读取判断
-
核心工作
- 串并数据转换、硬件错误校验(ECC)、本地缓冲数据、中断协调 CPU
- 一块控制器可管理多个同类型外设(最多 8 个)
- 计算机硬件层级

CPU (MMU) → 总线 → 各类控制器(硬盘 / USB / 视频 / 键盘)→ 外设
映射 I/O
方式 1:端口映射 I/O(隔离 I/O,x86 原生)

- 地址空间:内存、I/O 端口是两个完全独立地址空间,互不重叠
- 指令:专用 IO 指令
IN(读端口)、OUT(写端口),普通MOV无法访问端口 - 特点:硬件独立控制线区分内存 / IO 访问;隔离性强、冲突少;高级语言要内嵌汇编操作 IO
- 代表架构:x86(0~64K 为独立 IO 端口空间)
方式 2:内存映射 I/O(MMIO,主流通用)
- 地址空间:内存与 I/O 寄存器共享同一个地址空间,外设寄存器占用一段物理内存高端地址
- 指令:普通内存读写指令(
MOV等)即可操作设备,无特殊 IO 指令 - 优点:编程简单(C 语言指针直接访问)、统一指令、安全机制依托虚拟内存权限控制
- 缺点:内存缓存会造成缓存一致性问题(寄存器实时状态被缓存干扰),硬件需对 IO 地址页禁用缓存;单地址空间所有模块均校验地址,系统开销大
- 代表架构:PDP-11、ARM、多数嵌入式设备
混合方案(x86 实际使用)
控制寄存器走独立 IO 端口;大批量数据缓冲区采用 MMIO 映射,兼顾两者优势。
总线结构

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

现代 PC 架构:专用高速内存总线 + PCIe 外设总线(SATA/USB/ 网口挂在平台控制器 PCIe 插槽)
高速内存总线:CPU 内核 / 缓存 ↔ 内存控制器 ↔ DDR 内存,专供内存高速访问
PCIe 外设总线(平台控制器 PCH):挂载 SATA 硬盘、USB、网卡、显卡、PCIe 插槽
单总线缺陷:所有设备争抢同一总线,地址匹配开销大;现代机拆分专用总线提升效率
MMIO 多总线寻址 3 种方案
| 方案 | 逻辑 | 优缺点 |
|---|---|---|
| 顺序总线访问 | 先发内存总线请求,失败再切 I/O 总线 | 实现简单,多次切换总线性能差 |
| 探查设备法 | 总线上硬件监控 I/O 地址,直接转发请求 | I/O 设备速度慢,易形成性能瓶颈 |
| 地址过滤法 | 内存控制器预存内存 / I/O 地址区间 | 效率高,但系统初始化配置复杂,配置错误会地址错乱 |
DMA 直接内存访问

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 缓存再转发”,灵活性更强(支持内存互拷)。
中断

完整中断流程
- I/O 设备完成任务 → 设备控制器发送中断信号给中断控制器
- 中断控制器按优先级排队、仲裁,向 CPU 发中断请求
- CPU 保存现场(PC 程序计数器、PSW 程序状态字、通用寄存器),压栈保存
- CPU 跳转至中断向量表对应中断服务程序处理设备
- 处理完毕,恢复寄存器与 PC,回到被打断程序继续执行
中断向量表:存储每个中断对应的服务程序入口地址,可硬件固定 / 内存动态分配
中断控制器:集中管理所有外设中断,优先级调度、屏蔽中断、确认中断完成
陷阱 (trap):软件主动触发中断,和硬件外设中断共用同一套向量处理逻辑
精确 / 不精确中断
流水线 / 超标量 CPU :中断触发时,流水线存在多条处于不同执行阶段的指令(部分完成、部分未启动);单纯依靠 PC 无法准确区分已执行 / 未执行指令,直接恢复会导致逻辑错误。
精确中断

PC 保存位置固定,中断后可精准恢复执行点
PC 指向指令之前所有指令全部执行完毕,状态已写入处理器
PC 指向指令之后所有指令完全未启动
PC 当前指令执行状态完整可记录,可决定重跑 / 跳过
满足以上 4 点,中断前后系统状态一致,无逻辑错乱。
不精确中断

不满足任意一条精确中断规则;流水线内指令执行进度混乱,恢复现场无法保证程序正确性,硬件设计尽量规避。
I/O 软件原理
核心设计目标
1 设备独立性

定义:应用程序代码无需绑定具体硬件,一套代码可操作硬盘、U 盘、DVD、键盘等不同设备。
实现手段:统一命名
Unix/Linux 把所有外设映射成文件,用统一文件路径访问(如
/dev/sda硬盘);上层读写文件接口完全一致,屏蔽底层硬件差异。例子:
sort命令输入可接键盘 / 磁盘,输出可存硬盘 / 打印屏幕,无需修改程序。作用:程序可移植、开发简化、用户不用记忆硬件专有指令。
- 分层错误处理
错误自底向上逐级处理:设备控制器自检修复 → 驱动程序重试 → OS / 应用层兜底
上层不用关心底层故障细节,屏蔽硬件异常细节,提升系统稳定性。
-
同步 / 异步(中断驱动)传输分离

同步 I/O:CPU 发起 I/O 后阻塞等待传输完成,全程不执行其他任务。
异步 I/O(中断驱动):CPU 下发指令后立刻切换执行其他任务;设备完成后发中断通知 CPU 处理,CPU 利用率高,现代系统默认方案。
- 缓冲
核心作用:平衡高速 CPU / 内存与低速外设的速率差,避免数据丢失、平滑流量。
底层逻辑:数据不直接跨设备直传,先放入缓冲区中转。
5.共享和独占
独占设备:物理上只能一人用,靠 SPOOL 实现多进程共享使用;
共享设备:天然支持多进程并发读写,磁盘是典型代表;
IO 软件核心任务:对两类设备做访问协调,避免数据混乱、提升硬件利用率。
I/O 控制方式
驱动软件操控硬件 IO 的三种底层方案
方式 1:程序控制 I/O(轮询 / 忙等 Polling)

流程:CPU 发 I/O 指令 → 循环反复读取设备状态位,直到操作完成,全程占用 CPU。
缺点:CPU 持续空转,资源浪费,低速设备场景性能极差。
适用场景:I/O 等待时间极短、低成本嵌入式设备。
核心特征:无中断机制,设备不会主动通知 CPU。
方式 2:中断驱动 I/O

流程: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 层次结构

中断处理程序
中断处理程序又称中断服务程序(ISR),是 I/O 四层软件里最底层,软硬件交互的底层接口;
触发来源:硬件中断、软件中断、程序异常;
核心作用:硬件 I/O 完成后通知 CPU,完成软硬件模式切换,唤醒阻塞的驱动 / 进程,处理硬件中断事件。
核心收尾逻辑:中断处理完成后,需要唤醒等待该 I/O 的阻塞线程,提供 3 种标准唤醒机制:
- 信号量机制:执行
up释放信号量,唤醒阻塞线程,多用于多线程资源等待; - 管程机制:执行
signal操作,生产者消费者模型典型用法; - 消息传递机制:发送消息通知恢复运行,多用于分布式、微服务进程通信。
| 类型 | 核心特点 | 适用场景 |
|---|---|---|
| 非嵌套中断 | 处理中断时屏蔽所有新中断,串行处理,逻辑最简单 | 简单单片机、单外设小型设备 |
| 嵌套中断 | 仅屏蔽同 / 低优先级中断,高优先级中断可抢占当前中断,实时性强 | 实时控制系统、工业控制器 |
| 可重入中断 | 多线程可同时调用同一段 ISR,使用局部变量、锁保护共享资源 | 多任务并发操作系统 |
| 简单优先级中断 | 仅划分少量优先级,无复杂分组 | 简易小型嵌入式设备 |
| 标准优先级中断 | 精细划分多级优先级,高优中断可打断低优中断 | 复杂网关、通信设备 |
| 高优先级中断 | 极高响应时效,优先抢占执行 | 飞行器、传感器安全控制 |
| 优先级分组中断 | 中断分组管理,组内定义抢占规则,兼顾公平与速度 | 多媒体播放器、复杂桌面系统 |
中断处理 10 大完整流程

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

定义:设备驱动程序是衔接操作系统与设备控制器的专用程序,负责将上层通用 I/O 请求,翻译成控制器寄存器可识别的硬件指令,完成硬件读写控制。
两种运行模式
(1)内核态驱动(Linux/Windows 主流)
- 运行在内核地址空间,直接访问硬件物理地址;
(2)用户态驱动(MINIX3 典型架构)
- 驱动作为独立用户进程运行,不嵌入内核;用户进程发起 I/O 需通过系统调用中转内核;
设备驱动核心工作流程
接收上层 I/O 读写请求;校验设备状态:设备忙则请求入等待队列;空闲则继续执行;
设备初始化:启动电机、上电、自检,等待硬件就绪;
生成硬件指令序列,写入设备控制器寄存器;
控制器逐条执行指令,每执行一条校验确认;全部指令完成后触发硬件中断;
中断处理程序唤醒驱动,驱动校验传输数据,向上层返回操作结果。
与设备无关的 I/O 软件
核心定义:不绑定任何物理硬件,屏蔽底层设备差异,向上层应用提供统一、标准化的通用 I/O 接口,实现设备独立性。
五大核心基础功能
缓冲管理
在内存开辟缓冲区暂存读写数据,消除 CPU 高速与外设低速的速度差,减少硬件访问次数、降低中断频次、提升系统吞吐。
统一错误报告
屏蔽不同硬件差异化报错逻辑,将底层硬件故障统一封装为标准错误码,简化上层程序开发。
设备驱动统一接口
为块设备、字符设备定义标准化调用规范,新增硬件只需适配驱动,无需修改内核上层逻辑。
设备分配与释放
管理独占型设备(打印机),实现互斥访问;提供两种处理策略:
策略 1:设备被占用时直接返回失败;
策略 2:请求进程阻塞等待,设备释放后自动唤醒;
维护设备等待队列,避免多进程资源抢占冲突。
屏蔽物理块大小差异
不同磁盘扇区大小不同,本层向上层提供统一逻辑块尺寸,应用无需关心底层硬件扇区规格。
缓冲三种实现模型
(1)无缓冲区模型(性能最差)
流程:每到达 1 个字符触发中断→唤醒用户进程→进程读取单字符后再次阻塞。
缺陷:频繁进程切换、大量 CPU 开销,用户进程长时间阻塞,系统性能损耗严重。
(2)单缓冲区模型(用户空间缓冲)
流程:中断持续写入用户缓冲区,缓冲区填满后统一唤醒进程,一次性读取批量数据。
优化:减少唤醒次数,但存在缺陷 —— 缓冲区填满前新数据无存储位置,易丢失字符。
(3)内核双缓冲模型(工业通用最优方案)
流程:
内核设置两块缓冲区,硬件数据先写入内核主缓冲;
主缓冲填满后,系统将数据拷贝至用户缓冲区;
拷贝期间新到达数据写入备用缓冲,主缓冲清空复用;
优势:无数据丢失,中断与用户进程读写并行,吞吐量大幅提升。
拓展:除双缓冲外,还有循环缓冲(环形缓冲区),适合流式持续数据收发。
用户空间的 I/O 软件
核心交互方式:依靠操作系统提供的系统调用完成内核请求,自身无法直接访问硬件寄存器。
附录
基本io层次结构没怎么听 磁盘 也没听 要期末复习了
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)