解释中断向量

​ 对应每个中断源设置一个向量,这些向量顺序寸在主存储器的特定存储区。向量的内容是相应中断服务程序的起始地址和处理机状态字。在响应中断时,由中断系统硬件提供向量地址,处理机根据该地址取得向量,并转入相应的中断服务程序。

​ 把中断/异常与相应的处理方法对应起来,每种中断都会对应一个中断向量号,而这个向量号通过中断描述符表就与相对应的中断处理程序对应起来了。

解释中断类型码

​ 把每个中断服务程序进行编号,这个号就代表一个中断服务程序,就是中断类型码,是计算机用来查找中断向量用的。中断指令格式一般为”INT n”,其中 n 被称为中断类型码

解释中断向量表

​ 中断向量表是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据 4 字节空间。中断向量表是 8086 系统内存中最低端 1K 字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储 256 个中断向量。

​ 中断向量表在内存单元的最低处,地址空间为 00000H 003FFH(0-1024B)。

​ 这个地址正好和中断类型码有一种对应的关系:中断类型码*4(一个中断向量所占的空间) 就等于这个中断向量的首地址。

实模式下中断程序地址如何得到?

​ 中断指令”INT n”表示调用 n 号中断处理程序,根据中断类型码 n×4 得到中断向量首地址,从中断向量表中取得中断向量地址(段地址存入 CS,偏移量存入 IP),在中断处理程序中,用中断返回指令 IRET 使CPU 返回主程序断点继续执行;

保护模式下中断程序地址如何得到?

​ 先获得IDT,查询 IDT 以IDTR 指定的 IDT 基地址为起始地址,调用号 N*8 算出偏移量, 即为 N 号终端们描述符首地址,由此处取出中断门 8 字节;查询描述符表根据中断门的选择子和偏移量得到中断程序地址。

中断向量地址如何得到?

​ 中断类型号 * 4 = 存放中断向量的首地址

实模式下如何根据中断向量的地址得到中断程序地址?

​ 中断向量高 2 字节存放基址,低 2 字节存放段内偏移量,由基址和偏移量得到中断程序地址。

解释中断描述符

​ 中断描述符除了含有中断处理程序地址信息外,还包括许多属性和类型位。每个中断描述符占用连续的 8 个字节,分为 3 类:任务门,中断门和自陷门,CPU 对不同的门有不同的处理方式。

​ 低地址的 0、1 字节是中断代码的偏移量 A15-A0;高地址的 6、7 字节是中断代码的偏移量 A31-A16;2、3 字节是段选择符,段选择符和偏移量用来形成中断服务子程序的入口地址;4、5 两个字节称为访问权限字节,标识该中断描述符是否有效、服务程序的特权级和描述符的类型等信息。

保护模式下中断描述符表如何得到?

​ 装载中断描述符表寄存器 CPU 切换到保护模式前,运行于实模式下的初始化程序必须使用 LIDT 指令装载中断描述符表 IDT,将 IDT 基地址(32 位)与段界值(16 位)装入IDTR(一个 48 位的全地址寄存器,中断描述符表寄存器),基地址定义 IDT 在存储器中的起始点,段界值定义 IDT 所占的字节数。在返回实模式或系统复位时,IDTR 中自动装入 000000H 的基地址值与 03FFH 的段界值。

保护模式下中断门如何得到?

​ 查中断描述符表以 IDTR 指定的中断描述符表的基地址为起始地址,用调用号 N*8 算出偏移量,即为 N 号中断门描述符的首地址,由此处取出中断门的 8 个字节。

保护模式下如何根据中断门得到中断处理程序地址?

​ 查全局或局部描述符表根据中断门中的选择子(段选择符)和偏移量得到中断处理程序入口

中断的分类,举例不同类型的中断?

从中断源的角度分类:

  1. 由计算机硬件异常或故障引起的中断,也称为内部异常中断;

  2. 由程序中执行了中断指令引起的中断,也称为软中断。由程序员通过 INT 或 INT3

    指令触发,通常当作 trap 处理,用处是实现系统调用

  3. 外部设备(如输入输出设备)请求引起的中断,也称为外部中断或 I/O 中断

另一个角度分类主要有两类:

  1. 中断:由 CPU 以外的事件引起的中断,如 I/O 中断、时钟中断、控制台中断等;

  2. 异常:来自 CPU 的内部事件或程序执行中的事件引起的过程,如由于 CPU 本身故障、程序故障和请求系统服务的指令引起的中断等。

外部中断的分类:

  1. 可屏蔽中断:禁止响应某个中断,保证在执行一些重要程序中不响应中断,以免造成迟缓而引起错误;

  2. 不可屏蔽中断:重启、电源故障、内存出错、总线出错等影响整个系统工作的中断是不能屏蔽的。

中断与异常的区别?

  1. 中断时 CPU 所具备的功能,通常因为硬件而随机发生;

    异常是软件运行过程中的一种开发过程中给没有考虑到的程序错误。

  2. 中断是 CPU 暂停当前工作,有计划地去处理其他的事情,中断的发生一般是可以预知的,处理过程也是事先制定好的,处理中断时程序是正常运行的;

    异常是 CPU 遇到了无法响应的工作,而后进入一种非正常状态。异常的出现表面程序有缺陷。

  3. 中断是异步的,异常是同步的。

    中断是来自处理器外部的 I/O 设备的信号的结果,它不是由指令流中某条指令执行引起的,从这个意义上讲,它是异步的,是来自指令流之外的;

    异常是执行当前指令流中的某条指令的结果,是来自指令流内部的,从这个意义上来讲,它是同步的。

  4. 返回点不同。良性的如中断和 trap,只是在正常的工作流之外执行额外的操作, 然后继续干没干完的活。因此处理程序完了以后返回到原指令流的下一条指令, 继续执行。

    恶性的如 fault 和 abort,对于可修复 fault,由于是在上一条指令执行过程中发生(是由正在执行的指令引发的)的,在修复 fault 后,会重新执行该指令;至于不可修复的 fault 和 abort,则不会再返回。

  5. 中断是由于当前程序无关的中断信号触发的,CPU 对中断的响应是被动的,且与 CPU 模式无关,既可以发生在用户态,又可以发生在核心态。

    异常是由控制单元产生的,大部分异常发生在用户态。

实模式和保护模式下的中断处理差别

保护模式下的中断处理与实模式下的中断处理最大的区别在于寻找中断处理代码入口的方式,在保护模式下,为每个中断和异常定义了一个中断描述符,用来说明中断和异

常服务程序的入口地址的属性,由中断描述符表取代了实模式下的中断向量表。而实模式的中断向量表固定在存储器的最底部,保护模式下的 IDT 则是可以改变的。

如何识别键盘组合键(如 Shift+a),是否有其他解决方案?

定义 6 个 Boolean 变量来表示键盘左右 shift、alt、ctrl 键状态,当被按下时,对应变量变为 true,放开弹起时对应变量改为 false。如果键(如左或右 shift)状态值为 true,此时按下另一个键(a),column 值变为 1,此时则取keymap[column],即 keymap[]中第二列相应的值,此处为 A。

IDT 是什么,有什么作用?

中断描述符表,用于将每个异常或中断向量分别与他们的处理过程联系起来,最大只有

256 项(2K 大小)。

IDT 中有几种描述符?

IDT 中可以存放 3 种类型的门描述符:中断门描述符、任务门描述符、自陷门描述符。

异常的分类?

  1. 故障(fault):是一种可被更正的异常,而且一旦被更正,程序可以不失连续性地继续执行。返回地址是产生 fault 的指令。

  2. 陷阱(trap):是一种在发生 trap 的指令执行之后立即被报告的异常,它也允许程序或任务不失连续性地继续执行。返回地址是产生 trap 的指令之后的那条指令。

  3. 异常中止(abort):不总是报告精确异常发生位置的异常,不允许程序或任务继续执行,而是用来报告严重错误的。

用户态和内核态的特权级分别为多少?

用户态特权级为 3,内核态特权级为 0

中断向量表中,每个中断有几个字节?里面的结构是什么?

每个中断向量包含 4 字节,低地址两字节放偏移,高地址两字节放段描述符。

中断和异常的共同点(至少 2 点),不同点(至少 3 点)共同点:

共同点:

  1. 都是程序执行过程中的强制性转移,转移到相应的处理程序。

  2. 都是软件或赢家发生了某种情形而通知处理器的行为不同点:

不同点:

  1. 中断时 CPU 所具备的功能,通常因为硬件而随机发生;

    异常是软件运行过程中的一种开发过程中给没有考虑到的程序错误。

  2. 中断是 CPU 暂停当前工作,有计划地去处理其他的事情,中断的发生一般是可以预知的,处理过程也是事先制定好的,处理中断时程序是正常运行的;

    异常是 CPU 遇到了无法响应的工作,而后进入一种非正常状态。异常的出现表面程序有缺陷。

  3. 中断是异步的,异常是同步的。

    中断是来自处理器外部的 I/O 设备的信号的结果,它不是由指令流中某条指令执行引起的,从这个意义上讲,它是异步的,是来自指令流之外的;

    异常是执行当前指令流中的某条指令的结果,是来自指令流内部的,从这个意义上来讲,它是同步的。

  4. 返回点不同。良性的如中断和 trap,只是在正常的工作流之外执行额外的操作, 然后继续干没干完的活。因此处理程序完了以后返回到原指令流的下一条指令, 继续执行。

    恶性的如 fault 和 abort,对于可修复 fault,由于是在上一条指令执行过程中发

    生(是由正在执行的指令引发的)的,在修复 fault 后,会重新执行该指令;至于不可修复的 fault 和 abort,则不会再返回。

  5. 中断是由于当前程序无关的中断信号触发的,CPU 对中断的响应是被动的,且与 CPU 模式无关,既可以发生在用户态,又可以发生在核心态。

    异常是由控制单元产生的,大部分异常发生在用户态。