I/O 系统
输入/输出系统
- 输入设备:用于向计算机系统输入命令和本文或数据,比如鼠标和键盘。
- 输出设备:用于将计算机系统的信息输出到外部进行显示、交换的部件。
- I/O 接口:外部设备和主机之间进行数据传输时进行各种协调工作的逻辑部件,暴扣传输过程中速度的匹配、电平和格式转换等。
- I/O 软件:包含驱动程序、管理程序等,这些程序通过 I/O 指令来实现 CPU 和 I/O 设备的信息互换。
- I/O 端口:接口电路中可以直接被 CPU 访问的寄存器
I/O 端口
组成部分
一个 IO 端口通常包括以下部分:
- 数据寄存器:存储当前要传输的数据。
- 状态寄存器:存储设备的运行状态,如“忙碌”或“空闲”。
- 控制寄存器:存储对设备的控制命令,例如启动或停止设备。
编址方式
I/O 端口主要包含数据端口、状态端口和控制端口,若干端口加上响应的控制逻辑电路组成接口。通常,CPU 能对数据端口执行读写操作,但对状态端口只能执行读操作,对控制端口只能执行写操作。
为了方便 CPU 对于 I/O 端口的访问,需要对各个端口进行编号,每个端口对应一个端口地址。编址方式主要有如下两种:
- 统一编址(Memory-Mapped I/O):
- 特点:计算机的内存和 I/O 设备都被看做是内存地址空间的一部分,即内存地址和 I/O 地址共享同一个地址空间。
- 优点:访问I/O端口和访问内存单元一样,所有访问内存的指令都可以访问I/O端口,不用设置专门 的I/O指令;也不需要专用的I/O端口控制信号,简化了系统总线。
- 缺点:占用一部分CPU地址空间。划出的端口地址范围,不能再作为内存地址使用 ,所以减少了内存地址空间。
- 独立编址(Isolated I/O):
- 特点:计算机使用专门的 I/O 指令和地址空间来访问外部设备,与内存地址空间分开。
- 优点:不占用内存空间,而且I/O端口地址线根数少,译码电路简单。
- 缺点:需要专用的控制信号和专用的I/O指令。
I/O 方式
程序查询方式
CPU 重复检查 I/O 设备的状态,确定是否可以进行数据传输。
- 查询:CPU 定期查询或检查 I/O 设备的状态寄存器,查看设备是否准备就绪。
- 判断:如果设备未就绪,CPU 会继续执行其他任务或持续轮询;如果设备就绪,则进行数据传输。
- 数据传输:CPU 直接与 I/O 设备交换数据,可以是读操作或写操作。
- 结束:数据传输完成后,CPU 继续执行其他任务,同时继续轮询 I/O 设备状态。
程序中断方式
在程序中断方式中,当 I/O 设备准备好进行数据传输时,会触发一个硬件中断来通知 CPU。 CPU 会暂停当前正在执行的任务,处理中断,然后恢复执行被中断的任务。
相比于轮询方式,CPU 在执行程序中断之前不需要一直检查 IO 设备的状态,这提升了效率。
中断处理过程
- 中断触发:
- 当外部设备完成操作或需要注意时,它会发送一个信号到处理器的中断请求(IRQ)线路。
- 如果中断使能,并且当前的中断优先级允许,处理器会响应这个中断信号。
- 中断识别:
- 处理器完成当前指令的执行,并开始中断处理过程。
- 处理器检查中断向量表(一个存储了不同中断处理程序地址的表),确定哪个中断被触发。
- 保存上下文:
- 处理器会保存当前任务的状态,通常包括程序计数器(PC)、程序状态字(PSW)和其他必要的寄存器,以便中断处理完成后能够恢复。
- 中断服务程序(ISR)调度:
- 处理器根据中断向量表跳转到相应的中断服务程序(ISR)。
- 在执行中断服务程序之前,处理器可能会禁止或优先级屏蔽进一步的中断,以防止中断处理程序被其他中断打断。
- 执行中断服务程序:
- 中断服务程序执行所需的操作以响应外部中断,比如从 I/O 设备读取数据或向其发送数据。
- 恢复上下文:
- 中断服务完成后,处理器通过恢复之前保存的状态(上下文)来恢复中断之前执行的任务。
- 中断返回:
- 处理器执行一条专门的中断返回指令(比如 x86 架构中的 IRET 指令),该指令将程序计数器(PC)和程序状态字(PSW)等恢复到中断前的值,然后继续执行中断之前的程序。
保护断点和保护现场的区别
保存断点和保存现场在上述中断过程中我们统称为保存上下文了,但是在考研中有时候会将这两者区分开来,需要注意两者的区别:
- 保存断点:由中断隐指令自动保存,保存 CPU 在中断时即将执行的指令地址,即通过寄存器
CS:IP
指向的内存地址,完成中断后可通过保存的CS:IP
内容恢复下一条指令的执行。 - 保存现场:在中断服务程序内保存,中断服务程序可能会使用到 CPU 中的某些寄存器,通过保存这些寄存器的内容,确保在中断程序执行完后,CPU 可以恢复到执行中断服务程序前的状态。
多重中断和中断屏蔽
若 CPU 在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而 CPU 对新的中断请求不予响应,则这种中断称为单重中断。
若 CPU 暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套。
CPU 要具有处理多重中断的功能,必须满足下列条件:
- 在中断服务程序中提前设置开中断指令。
- 优先级高的中断源有权中断优先级低的中断源。
可以利用中断屏蔽技术动态调整中断处理优先级,每个中断源都有一个屏蔽触发器,1 表示屏蔽该中断源的请求,0 表示可以正常申请,所有的屏蔽触发器组合在一起便构成一个屏蔽字触发器。
如上图,中断屏蔽字中的每一位表示在执行一个中断的时候,我们是否屏蔽来自于其他中断源的请求。比如 B 的优先级高于 C、D,所以在处理来自于中断源 B 的中断时,需要屏蔽 B、C、D,即屏蔽字为 0100。
DMA 方式
DMA(Direct Memory Access,直接内存访问)是一种计算机系统的 I/O(输入/输出)方式,它允许外部设备直接访问主内存而无需 CPU 的干预。
步骤
- 预处理:在进行 DMA 传输之前,CPU 需要进行初始化设置,包含源地址、目标地址、数据传输长度以及数据传输方向。
- DMA 请求:外设向 DMA 控制器发送 DMA 请求,并向 CPU 发送总线请求。
- 获取总线控制权:CPU 响应总线请求,发出总线响应信号,DMA 控制器接管总线控制权,进行 DMA 操作周期。
- 数据传输:DMA 控制器进行数据传输,这个过程不需要 CPU 的干预。
- 释放总线控制权:一旦 DMA 控制器完成数据传输,它会发出 DMA 传输完成信号,通知外设设备数据已经传输完毕。同时 DMA 控制器会释放总线控制权,使 CPU 可以继续执行其他任务。
使用总线方式
- 总线独占(Bus Mastering):
- 在这种模式下,DMA 控制器会取得对总线的独占控制权。在传输期间,CPU 将无法访问内存,因为总线已经被 DMA 控制器占用了。
- 在独占期间,CPU 通常会执行不涉及内存访问的指令,如计算或寄存器操作,或者进入等待状态直到 DMA 操作完成。
- 周期挪用(Cycle Stealing,也叫做循环窃取):
- 在循环窃取模式下,DMA 控制器会逐个窃取总线周期来进行数据传输,而不是一次性占据所有的总线周期。
- 这意味着 CPU 在 DMA 控制器未使用总线时仍然可以访问内存。因此,DMA 和 CPU 会交替使用总线,通常不会显著影响 CPU 的操作。
- 分时多路复用(Time-Division Multiplexing):
- 在分时多路复用模式下,DMA 控制器和 CPU 会在预定的时钟周期内轮流使用总线。
- 这种方式确保了 CPU 和 DMA 控制器都可以在它们的时隙内访问内存,但都无法全时段访问。
注意
CPU 和 DMA 控制器哪一个对于总线访问的优先级更高?
当 CPU 和 DMA 都需要访问主存时,DMA 控制器可以优先获得总线使用权。因为磁盘一旦开始读写,就必须按时完成数据传送,否则数据缓冲区中的数据会发生丢失。