【计算机组成原理】中断和输入输出

来源:互联网 发布:全景视频转换软件 编辑:程序博客网 时间:2024/06/05 19:44

前言

这篇文章,我把中断异常、输入输出,两个部分放到一起,因为它们之间的联系实在很深。

中断和异常

在程序运行时,系统内部,外部或者程序本身出现一些需要特殊处理的“事件”,CPU立即强行中断当前程序,并改变机器状态来执行一段处理这个“事件”的程序,然后再回来继续执行之前的程序。这种机制,就叫中断(异常)。

早期的计算机,只要做做计算任务就行了,与外界的交互非常简单,但随着不断的发展,交互方式越来越丰富,中断机制不断显示出了它的重要性。

中断的具体过程

内部中断和外部中断:

  • 内部中断就是CPU内部的不可屏蔽的中断,在x86的实模式下,有断点,单步,溢出,除零中断。其中,除零中断会自动触发,其余的中断一般需要用显式的方式在程序中写明,如果满足条件则触发。
  • 外部中断,就是与外部设备交互的中断。比如BIOS中断,DOS中断,都是一种外部中断,它们提供的都是一些功能性的中断,比如输出输出。显然这些也是需要你在程序里显示调用的。

过程:

  1. 关中断。CPU关闭中断(标志寄存器中的IF位),不允许外部中断。
  2. 保护断点。把中断处的指令地址压入堆栈。
  3. 识别中断源。CPU中断处理器来确定中断号,找到中断程序的入口地址。
  4. 保护现场。把中断处指令相关的寄存器以及标志寄存器都要入堆栈。
  5. 转到中断服务程序入口开始执行。
  6. 恢复现场并返回。把IP,等寄存器都弹栈,然后执行中断返回指令。

中断向量表。

  • 实模式下,中断向量表就放在存储器的最低地址区域。CPU中断处理电路先找到中断号,然后将对应的中断向量里的内容,分别放入IP和CS寄存器中。
  • IA-32的保护模式下的访存方式不同了,同时CS寄存器的使用方式不同了,以前是直接放段基址,现在是放描述符,描述符表的起始地址是通过一个新的寄存器GDTR来保存的,所以这种模式下,访问存储器的方式就变成了,通过CS寄存器的值查GDT,然后从表项中提取段基址和偏移,放入相应的寄存器,再对内存寻址。所以,中断也是类似的,通过IDTR和IDT来获得CS和EIP的值,然后再次用GDTR和GDT的配合,来真正找到中断入口地址。保护模式确实很繁琐。

一个突然想到的问题:
我们前面讲了流水线CPU,一个流水中通常都是包含了多条正在执行的指令,在中断来临的时候,那些未执行完的指令怎么处理呢?

我觉得应该把那些未执行完的指令全部清空。不过后来,我在《现代操作系统》这本书里,找到了答案,作者说会把中断分为精确中断和不精确中断,前者就是我的猜想那样,会把那些未执行完的指令造成的所有影响都撤销,而后者更复杂,操作系统编写者也为此头疼。

输入和输出

早期的计算机,CPU处理输入输出的方式非常简单,就是和读写存储器的方式一样,往地址总线上传个地址,控制总线上传个读写信号,数据总线上传数据。但是外部设备种类和要求不同的时候,这种方式就不靠谱了。于是计算机科学家们就想出了很多方法。

I/O接口:
I/O接口是一块芯片,有数据寄存器,状态寄存器等,它与不同的设备控制器相连,并在CPU与它们之间传递数据。这样就能统一的管理输入输出设备,消除了外设和CPU之间的速度差异,CPU也能继续保持原来的方式读写了。通常,会有多个I/O接口。

I/O接口的编址方式:
CPU要访问I/O端口(这里端口指那些数据寄存器),就需要给这些端口编址。有两种方式,与存储器分开编址和与存储器统一编址,前者是x86体系的实现,后者是ARM,MIPS等体系的实现。

I/O接口传输的控制方式:

  • 无条件传送方式。CPU直接使用指令与外设传递数据,不查询外设的工作状态。
  • 程序查询传送方式。CPU通过执行一段循环的查询程序,如果发现外设已准备就绪,才开始传输。
  • 中断控制方式。发出传输指令,然后CPU继续执行其他指令,I/O接口会主动发起中断信号。不同的外设发出的中断信号会被中断控制器按优先级或者某种设定进行处理,所以不同担心冲突的发生。
  • DMA方式。DMA控制器来帮助CPU“指挥”数据在I/O接口与内存之间的传输。CPU只要设置DMAC的内部配置寄存器就好了。有些设备对I/O要求很高,通常会在自己的I/O接口芯片中自带DMAC。
0 0
原创粉丝点击