17_输入输出

Charlie

1. 外围设备

输入/输出操作通过连接到输入输出模块的各种外部设备完成, 这些外部设备提供了在外部环境和计算机系统之间的数据交 换,通常被称为外围设备(peripheral device),简称为外设 (peripheral)

  • 为什么不能把外设直接连接到系统总线上?
    • 外设种类繁多,操作方法多种多样
    • 外设的数据传送速度一般比存储器或处理器的慢得多
    • 某些外设的数据传送速度比存储器或处理器要快
    • 外设使用的数据格式和字长度通常与处理器不同

2. I/O模块

  • 通过系统总线或中央交换器和存储器连接
  • 通过专用数据线与一个或多个外设连接
  • I/O模块是计算机内部系统和外设之间的桥梁
    NVIDIA_Share_469_469.png

2.1. 外围设备的接口

  • 输入/输出模块的接口以控制、状态和数据信号的形式出现
  • 与设备相关的控制逻辑控制外设的操作,以响应来自输入/输出模块的命令
  • 缓冲器用于缓存输入/输出模块和外设之间传送的数据
    • 缓冲器的大小一般为8位或16位
    • 速率不一致,缓冲

NVIDIA_Share_473_447.png

2.2. I/O模块的功能

2.2.1. 处理器通信

  • 命令译码:输入/输出模块接收来自处理器的命令,这些命令一般 作为信号发送到控制总线
  • 数据:数据是在处理器和输入/输出模块之间经由数据总线来交换的
  • 状态报告:由于外设速度很慢, 所以知道输入/输出模块的状态很重要
  • 地址识别:输入/输出模块必须能识别它所控制的每个外设的唯一 地址

2.2.2. 设备通信

通信内容包含命令、状态信息和数据

2.2.3. 数据缓冲

  • 外设的数据传送速度一般比存储器或处理器的慢得多
  • 某些外设的数据传送速度比存储器或处理器要快

2.2.4. 控制和定时

  • 处理器会非预期的与一个或几个外设进行通信
  • 一些内部资源,如主存和系统总线,是被共享的
  • 例子:控制从外设到处理器的数据传送包括以下几个步骤
    • 处理器查询输入/输出模块以检验所连接设备的状态
    • 输入输出模块返回设备状态
    • 如果设备运转并准备就绪,则处理器通过向输入/输出模块发出一条命令,请求数据传送
    • 数据从输入/输出模块来到处理器

2.2.5. 检错

  • 检错并把差错信息报告给处理器
  • 差错类型
    • 设备报告的机械和电路故障
    • 传输过程中数据位的变化

2.3. I/O模块结构

NVIDIA_Share_1180_886.png

  • USB:通用串行总线(Universal Serial Bus)
  • FireWire:IEEE标准1394串行总线

3. I/O操作技术

  • 编程式 I/O:处理器通过执行程序来直接控制I/O操作,当处理器发送一条命令到I/O模块时,它必须等待,直到I/O操作完成
  • 中断驱动式 I/O:处理器发送一条I/O命令后,继续执行其他指令; 并且当I/O模块完成其工作后,才去中断处理器工作
  • 直接存储器读取(Direct Memory Access,DMA):I/O模块与主存直接交换数据,而不需要处理器的干涉
I/O与存储器传递方式无中断使用中断
通过处理器编程式I/O中断驱动式I/O
直接传递直接存储器存取(DMA)

3.1. 编程式I/O

  • 处理器在执行过程中遇到一条与I/O操作有关的指令时,它通过发送指令到适当 的I/O模块来执行这条指令
  • I/O模块将执行所要求的动作,然后在I/O 状态寄存器中设置一些适当的位
  • I/O不会中断处理器,因此处理器需要周期性地检查I/O模块的状态,直到发现该操作完成

NVIDIA_Share_292_626.png

3.1.1. I/O命令

  • 为了执行I/O操作,处理器发送一个指定具体I/O模块和外设的地址,并发送一条I/O命令
  • 类型
    • 控制命令:激活外设并告诉它要做什么
    • 测试命令:测试I/O模块及其外设相关的各种状态条件
    • 读命令:使I/O模块从外设获得一个数据,把它存入内部缓冲区
    • 写命令:使I/O模块从数据总线获得一个数据,把它传入外设

3.1.2. I/O指令

  • I/O指令很容易映射为I/O命令, 并且两者之间通常是简单的一 一对应关系
    • 指令的形式取决于外设寻址的方式
  • 编址方式
    • 存储器映射式I/O:存储单元和I/O设备有统一的地址空间
      • 能使用大的指令系统,可进行更有效的编程
    • 分离式I/O:让总线既有存储器的读线和写线,同时也有输入和输出命令线

3.2. 中断驱动式I/O

  • 处理器发送一个I/O命令到模块,然后去处理其它有用的工作
  • 当I/O模块准备好和处理器交换数据时,它中断处理器以请求服务
  • 处理器执行数据传送,最后恢复它原先的处理工作

NVIDIA_Share_344_681.png

3.2.1. 从处理器视角和IO视角看中断

NVIDIA_Share_1090_455.png
NVIDIA_Share_1070_370.png

3.2.2. 中断允许和中断禁止

  • 保存上下文和恢复上下文过程中禁止中断
  • 处理中断和恢复完上下文后允许中断
    NVIDIA_Share_1186_875.png

3.2.3. 响应优先级和处理优先级

NVIDIA_Share_1162_619.png

3.2.4. 设备识别

  • 多条中断线
    • 即使有多条中断线可用,每条线上也需要采用其它三种技术中的一种
  • 软件轮询
    • 轮询每一个I/O模块来确定是哪个模块发生的中断
  • 菊花链
    • 所有的I/O模块共享一条中断请求线,中断应答线采用菊花链穿过这些中断模块
  • 独立请求
    • 特定的中断控制器用于解码和分析优先级

类似:[[16_总线#3.2. 仲裁]]

3.2.5. 分配优先级

  • 多条中断线:处理器仅仅挑选具有最高优先级的中断线
  • 软件轮询:模块的轮询次序就决定了模块的优先级
  • 菊花链:链接模块次序就决定了模块的优先级
  • 独立请求:中断控制器决定

3.3. 直接存储器存取DMA

  • 不足
    • I/O传送速度受处理器测试和服务设备速度的限制
    • 处理器负责管理I/O传送,对于每一次I/O传送,处理器必须执行很多指令
  • 直接存储器存取
    • 无需经过处理器即可直接访问内存的模块

NVIDIA_Share_364_701.png

3.3.1. 处理过程

  • 处理器通过发送以下信息向DMA模块发出命令:读/写、I/O设备地址、内存中的起始位置、字数
  • 处理器继续进行其他工作
  • DMA模块将全部数据块,每次一个字,直接将数据传输到存储器或从存储器读出,而无需经过处理器
  • 当传输完成时,DMA模块向处理器发送一个中断信号

3.3.2. DMA内存访问

3.3.2.1. CPU停止法

  • 优点:控制简单
  • 缺点:影响CPU,没有充分利用内存
  • 适用:高速I/O设备的块传输
    NVIDIA_Share_948_300.png

3.3.2.2. 周期窃取

  • 优点:充分利用CPU和内存,及时响应I/O请求
  • 缺点:DMA每次都请求总线
  • 适用:I/O周期大于存储周期
    NVIDIA_Share_965_303.png

3.3.2.3. 交替分时访问

  • 优点:CPU未停止或等待,DMA不请求总线
  • 缺点:CPU周期大于存储周期
    NVIDIA_Share_915_326.png

3.3.3. DMA配置机制

3.3.3.1. 单总线分离DMA

  • 所有模块共享相同的系统总线
  • DMA模块使用编程式I/O,通过DMA模块在存储器和I/O模块之间交换数据
  • 便宜但低效
    NVIDIA_Share_847_213.png

3.3.3.2. 单总线集合的DMA-I/O

  • DMA逻辑实际上可能是I/O模块的一部分,也可能是控制一个或多个I/O模块的单独模块
  • 减少总线周期数
    NVIDIA_Share_775_230.png

3.3.3.3. I/O 总线

  • 使用I/O总线将I/O模块连接到DMA模块
  • 多个I/O模块共享DMA,且易于扩展
    NVIDIA_Share_771_283.png

NVIDIA_Share_610_729.png

4. I/O模块的演变

  • CPU直接控制外设
  • 增加控制器或I/O模块,CPU使用编程式I/O,将CPU与外围设备的细节分离
  • 采用中断,CPU无需花费时间等待外围设备就绪
  • I/O模块可通过DMA直接存取存储器,无需CPU负责存储器和I/O模块之间的数据传递
  • I/O通道(I/O channel):I/O模块有自己的处理器,带有专门为I/O操作定制的指令集
  • CPU指示I/O通道执行存储器中的I/O指令,只有在执行完成后才会中断CPU
  • I/O处理器(I/O processor):I/O模块有一个局部存储器,I/O模块成为一个自治的计算机,常用于与交互式终端进行通信
  • 只需最少的CPU参与即可控制大量I/O设备
  • 标题: 17_输入输出
  • 作者: Charlie
  • 创建于 : 2023-12-18 16:11:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/5f35f2c1/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论