参考资料: 《现代操作系统 3th edtion》原书第五章 输入/输出
在 xmind 上记录
一、硬件原理
大致分类
-
块设备
- CD-ROM/硬盘/USB
- 每个块都能独立于其他块而读写
-
字符设备
- 以字符为单位发送或接收一个字符流,而不考虑任何块结构
- 鼠标/打印机
-
其他设备
- 时钟
IO设备组成
-
电子部件
- 称作设备控制器(device controller)或适配器(adapter)
- 经常以主板上的芯片的形式出现,或者以插入(PCI)扩展槽中的印刷电路板的形式出现
-
机械部件
- 设备本身
控制器与CPU的通信
-
早期设计
- 每个控制器有几个寄存器用来与CPU进行通信
- 一个操作系统可以读写的数据缓冲区
- 每个控制寄存器被分配一个I/O端口(I/O port)号
-
内存映射IO
-
将所有控制寄存器映射到内存空间中
-
优点
- 可以用C语言编写, 不涉及汇编
- 不需要特殊的保护机制来阻止用户进程执行I/O操作
- 对于内存映射I/O,可以引用内存的每一条指令也可以引用控制寄存器
-
缺点
- 需要选择性禁用高速缓存
-
直接存储器存取
(Direct Memory Access,DMA)
- 外部设备不通过CPU而直接与系统内存交换数据的接口技术
三、软件原理
设计要点
- 设备独立性(device independence): 它可以访问任意I/O设备而无需事先指定设备
- 统一命名(uniform naming):文件名不依赖设备
- 错误处理(error handling)
- 同步(synchronous)(即阻塞)和异步(asynchronous)(即中断驱动)传输
- 缓冲(buffering)
- 共享设备和独占设备的问题
程序控制IO
- I/O的最简单形式是让CPU做全部工作,这一方法称为程序控制I/O(programmed I/O)
- 直到全部I/O完成之前要占用CPU的全部时间
中断驱动IO
- 在等待时运行其他进程
使用DMA的IO
- 本质上,DMA是程序控制I/O,只是由DMA控制器而不是主CPU做全部工作
四、I/O软件层次
硬件
中断处理程序
- 保存没有被中断硬件保存的所有寄存器(包括PSW)
- 为中断服务过程设置上下文,可能包括设置TLB、MMU和页表
- 为中断服务过程设置堆栈
- 应答中断控制器,如果不存在集中的中断控制器,则再次开放中断
- 将寄存器从它们被保存的地方(可能是某个堆栈)复制到进程表中
- 运行中断服务过程,从发出中断的设备控制器的寄存器中提取信息
- 选择下一次运行哪个进程,如果中断导致某个被阻塞的高优先级进程变为就绪,则可能选择它现在就
运行 - 为下一次要运行的进程设置MMU上下文,也许还需要设置某个TLB
- 装入新进程的寄存器,包括其PSW
- 开始运行新进程
设备驱动程序
- 每个连接到计算机上的I/O设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序(device driver),它一般由设备的制造商编写并随同设备一起交付
- 操作系统通常将驱动程序归类于少数的类别之一
- 大多数操作系统都定义了一个所有块设备都必须支持的标准接口,并且还定义了另一个所有字符设备都必须支持的标准接口
与设备无关的I/O软件
-
设备驱动程序的统一接口
- 要求驱动程序提供统一的函数
-
缓冲
-
双缓冲
- 当一个缓冲区正在被复制到用户空间的时候,另一个缓冲区正在收集新的输入
-
循环缓冲区
- 它由一个内存区域和两个指针组成,一个指向空闲,一个指向待取走
-
-
错误报告
- 软件要做的事情取决于环境和错误的本质
-
分配与释放专用设备
-
与设备无关的块大小
- 隐藏硬件层面的差异
用户空间的I/O软件
-
scanf/printf
-
假脱机系统
-
处理独占I/O设备的一种方法
- 守护进程
- 假脱机目录
-
XMind: ZEN - Trial Version
后记: 关于操作系统的IO设备比较重要的一点应该是DMA,但这也是这篇博客没怎么提到的内容