跳转至

I/O Systems

约 1494 个字 6 张图片 预计阅读时间 10 分钟

I/O硬件

基本组成

  • Port:端口,每一个设备都有自己的port number,根据每个设备的port number进行区分
  • Bus:总线,设备通过总线相连
  • Controller:设备上的芯片,通过bus和主机使用一些规定好的协议进行通信交互

通信方式

  • Special I/O instructions:设备发出特殊的指令进行通信
  • Memory-mapped I/O(更加常见):设备中的寄存器与内存中的一段逻辑地址进行映射,这样主机可以使用访问内存的方式对设备内容进行访问[可以和正常内存共享空间,也可以开辟一块独立的空间,现在一般使用前一种方式]

一种PC Bus的结构

a

和memory直接相连的是北桥(速度较快),一般使用拓展总线连接键盘这种交互频率较低的外部设备,然后拓展总线再连接到南桥上,南桥还负责电源管理等工作

不同控制器对应的端口

a

I/O端口的寄存器

  • Data-in: read by the host to get input
  • Data-out: written by the host to send output
  • Status: device status read by the host
  • Control: written by the host to start a command or change the mode of a device

in和out是相对于CPU而言的

Polling(轮询)

  1. 主机反复读取忙位,直到该位变为清除状态。
  2. 主机在命令寄存器中设置写位,并将一个字节写入数据输出寄存器。
  3. 主机设置命令就绪位。
  4. 当控制器注意到命令就绪位被设置时,它设置忙位。
  5. 控制器读取命令寄存器并看到写命令。它读取数据输出寄存器以获取字节,并对设备执行I/O操作。
  6. 控制器清除命令就绪位,清除状态寄存器中的错误位以指示设备I/O成功,并清除忙位以指示操作完成。

Interrupts(硬件中断)

  • CPU中断请求由I/O设备触发
  • 中断处理程序接收中断(可屏蔽以忽略或延迟某些中断)
  • 使用中断向量将中断分派到正确的处理程序
    1. 基于优先级
    2. 有些中断可以被屏蔽,有些中断不能被屏蔽nonmaskable(电源故障等)
    3. 中断链:用于处理比中断向量元素更多的设备,每个列表上的处理程序依次被调用。
  • 中断机制也用于异常

a

多种中断程序

  • 低优先级中断可以被高优先级中断抢占。
    1. 示例用法:高优先级处理程序
      1. 记录I/O状态
      2. 清除设备中断
      3. 启动下一个待处理的I/O,并引发低优先级中断以完成工作
    2. 稍后,低优先级处理程序
      1. 通过将数据从内核缓冲区复制到应用程序空间来完成用户级I/O,并调用调度程序将应用程序放置在就绪队列中

trap(由软件触发的中断)一般认为优先级是不高的。

DMA(Direct Memory Access)

需要DMA控制器。绕过CPU,直接在I/O设备和内存之间传输数据

a

要求读入的是连续的blcok,并且会放到内存中的连续空间中

当传输完全完成之后,才会告知CPU进行其他的工作

应用I/O接口

I/O系统调用将设备行为封装在通用类别中,设备驱动程序层隐藏了内核中I/O控制器之间的差异。

和API正好相反

内核I/O结构

a

kernel I/O subsystem负责将下层的不同结构进行封装

Block and Character Devices

  • 块设备包括磁盘驱动器
    1. 命令包括读、写、寻道
    2. 原始I/O或文件系统访问
    3. 可以进行内存映射文件访问
  • 字符设备包括键盘、鼠标、串行端口
    1. 命令包括获取、放置
    2. 顶层的库允许行编辑

Network Devices

网络设备可以认为是高速设备,既需要读,又需要写,一般通过套接字实现数据的交互。

底层会有别的网络设备进行支持(网卡提供相关操作)。

Clocks and Timers

提供时间信息以及时间中断等

Blocking and Nonblocking I/O

  • 阻塞 - 进程在I/O完成之前被挂起
    1. 易于使用和理解,但是不足以满足某些需求
  • 非阻塞 - I/O调用返回尽可能多的可用数据
    1. 用户界面,数据复制(缓冲I/O)
    2. 通过多线程实现,有多个不同的控制流
    3. 快速返回已读取或写入的字节数(读出来的数据量可能并不是自己需要的数据量)
  • 异步 - 进程在I/O执行时运行(返回时不一定在调用的流里面)
    1. I/O子系统在I/O完成时通知进程

a

内核I/O子系统

  • 调度
    1. 通过每个设备的队列进行一些I/O请求排序(磁盘调度)
    2. 一些操作系统尝试公平性
  • 缓冲 - 在传输过程中在内存中存储数据(I/O的速度相较于CPU的速率很低)
    1. 以应对设备速度不匹配,例如从调制解调器接收数据到磁盘(双缓冲[一个负责写数据,另一个负责读数据])
    2. 以应对设备传输大小不匹配,例如网络数据包
    3. 为了保持copy semantics(当写系统调用指定一个缓冲区来存储数据,并在系统调用之后修改其内容),也就是在正式使用之前进行空间预留
  • 缓存 - 快速内存保存数据的副本
  • 假脱机Spooling - 为设备保存输出,使得主机不会在设备输出时停摆
    1. 在设备一次只能处理一个请求的情况下使用
  • 设备保留 - 提供对设备的独占访问:用于分配和释放的系统调用,但是需要注意死锁

评论