最近开始学习操作系统原理这门课程,特将学习笔记整理成技术博客的形式发表,希望能给大家的操作系统学习带来帮助。同时盼望大家能对文章评论,大家一起多多交流,共同进步!
本文主要分以下几个方面:
- I/O硬件
- 应用于I/O的接口
- 内核I/O子系统
I/O硬件:
相关概念:控制器(controller),总线(bus),端口(port)
设备均有地址,用于:
- I/O直接指令
- 控制器信息映射到内存 Memory-mapped I/O
控制器寄存器,一般包含四个寄存器:
- Data-in:暂时存放读入数据,写入CPU
- Data-out:存储到外设的数据
- Status
- Control
CPU控制外设读写的方式:
1. 轮循方式 Polling
- 检查设备的状态:就绪(command-ready),忙碌(busy),出错(error)
- 会造成CPU对外设的忙等(busy-waiting)
2. 终端方式 Interrupts
- CPU有中断请求线(Interrupt-request line),由I/O设备触发
- 中断处理器接收终端
- 多数CPU由两类中断请求线:
- 非屏蔽(nonmaskable)
- 屏蔽->忽略或延时处理
- 中断处理可基于优先级,有些中断不可屏蔽
- 中断的相应处理机制也可用于处理异常(exception),在这里异常类似于trap(自陷)的概念
中断实现的I/O循环:
Direct Memory Access(DMA):
- 用于大规模数据传输;
- 需要DMA控制器
- 在I/O设备和内存间直接传输数据,绕过CPU
使用DMA传输数据的步骤:
- 告知设备控制器传输数据的地址
- 设备控制器告诉磁盘控制器向缓存中地址为X的空间传输大小为C字节的数据
- 磁盘控制器初始化DMA传输
- 磁盘控制器按字节向DMA控制器传输
- DMA控制器向缓存X传数据,提高内存地址并减小C直到C等于0
- 当C=0时,DMA向CPU发出中断请求,完成数据传输
块设备:磁盘,操作包括读,写,查询;
字符型设备:键盘,鼠标,串口,操作包括读(get)和写(put)
内核I/O子系统 Kernal I/O Subsystem
- Caching 缓存-高速存放数据备份的内存(内存和寄存器之间)
- 永远都只是拷贝
- 性能关键
- Buffering -在设备间传输数据时用来存放数据
- 用来解决传输速度不匹配问题
- 用来解决传输数据内容大小不匹配问题
- Spooling(Simultaneous Peripheral Operation On-Line)
- 用于保存输入输出设备,如果每个设备智能同时服务一个请求(例如打印机)
- 将独占型设备改造为可共享的虚设备
组成:
1. 输入井,输出井:用于暂时存放输入和输出数据
2. 工作进程,输出进程
3. 内存的缓存
错误处理:
- OS可从不同错误状态中恢复
- 大多数情况返回错误码
- 会以系统日志的形式记录错误