版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/84501735
I/O硬件原理
-
I/O设备
- 块设备
- 以块为单位传递信息
- 所有块都可以独立于其他块读写
- 字符设备
- 以字符为单位传递数据
- 不可寻址
- 块设备
-
内存映射I/O
- 每个设备都有一个设备控制器,每个控制器都有几个寄存器与CPU通信
- 通过读取和写入这些寄存器,操作系统可以控制和感知设备状态
- 控制寄存器被映射到内存空间,并且确保该内存地址不会和虚拟内存重叠
- 优点
- 可以直接使用C等高级语言编写I/O命令,而无需通过特殊的汇编代码访问这些寄存器
- 不需要特殊的保护机制防止用户进程执行I/O操作(I/O操作只能由内核进程执行),只要避免和虚拟地址空间重叠便可
- 缺点
- 不可使用cache,否则设备状态的改变将不会被CPU发现,必须通过硬件支持禁用部分cache
-
内部缓冲区
- 设备中的数据是先读到内部的缓冲区中,再发往内存的
- 原因
- 设备控制器可以在传送前先校验数据的正确性,避免传递错误数据
- 当磁盘等设备开始工作时,读出数据是以一个固定速度而不管控制器是否准备好接受的,如果直接发往内存,那么当总线忙时,控制器必须将读出的数据存在别的地方,产生大量管理工作
-
中断
- 精确中断
- 包含一个假设,即如果中断在一个指令后发生,则包含该指令的前面所有指令都执行完毕,后面的指令都没有执行
- 不精确中断
- 现代CPU是流水线的,甚至是超线程的,当中断信号发生时,各个指令可能处于不同的执行状态,PC无法准确反映执行完毕和未执行指令的边界
- 精确中断
I/O软件原理
- 设备驱动程序
- 驱动程序一般由硬件制造商编写,为操作系统提供统一的接口
- 由于设备的运行可能被中断,如网络驱动程序在接受程序包,所以驱动程序必须是可重入的
- 即一个正在运行的驱动程序可以支持在第一次被调用完成前被第二次调用
- 传统的Unix系统在添加新设备时必须重新编译内核
- 因为Unix系统一般由计算中心运行,I/O设备几乎不变
- 现代的操作系统如linux和Windows可以动态地装在新的设备
- 有些操作系统如minix将驱动程序运行在用户空间而非内核空间
- 这一构造消除了系统崩溃的主要源头
- 设备保护
- 系统如何防止无权访问设备的用户访问设备呢?
- 在linux等现代系统中,设备是以文件的形式出现的,于是对于文件的常规保护规则也可使用与I/O设备的保护
- 如何防止某些进程长期空占某些设备(如打印机)呢?
- 创建一个特殊的守护进程,该进程是允许使用打印机的唯一进程,将要打印的文件都装载到这个进程中