中断系统
中断,如名字所示,是强制性执行流的转移 也就是不管你处于哪个环境。 只要有中断和异常,都会强制执行的。换句话来讲就是从当前流程强制转到另一个流程
中断是 OS 中一个比较重要的概念,可以说中断驱动了 OS 的各种行为.
如:I/O 设备响应,异常处理,进程调度等
一些开发前要了解的知识
中断描述符表 (Interrupt Description Table)
- IDT 中存储的段描述符都是系统段描述符
- IDT 中的第一个元素不是 NULL(不为空)
- IDT 可以包含三种门描述符:①任务门描述符;②中断门描述符;③陷阱门描述符
IDT 表可以驻留在线性地址空间的任何地方,处理器使用 IDTR 寄存器来定位 IDT 表的位置。 这个寄存器中含有 IDT 表 32 位的基地址和 16 位的长度(限长)值。 IDT 表基地址应该对齐在 8 字节边界上以提高处理器的访问效率。 限长值是以字节为单位的 IDT 表的长度。
IDT 有特殊的标志位规定某些中断是否可以由用户程序使用 int <vector>
指令来触发
中断向量表 (Interrupt Vector Table: IVT)
在 x86 实模式承担 IDT 的功能,其作用与 IDT 基本相同,与 IDT 不同的是,IVT 固定基址为内存 0x00000000 处开始, 相比 IDT 也没有那么多特权级限制
在 PC/AT 中,规定 内存 储器的最低 1 KB 用来存放中断向量 (共 256 个),称这一片内存区为 中断向量表,地址范围是 0~3FFH
异常中断
异常中断是非可屏蔽中断,由 CPU 内部触发,用于向正在运行的内核发出需要其处理的一些异常。 在 Intel 规定中,前 32 个中断向量被留为异常
- 在中断流程里发生异常中断叫
Double Fault
- 在
Doubel Fault
里再次发生中断叫Triple Fault
当发生
Triple Fault
类型中断时候,计算机系统意识到发生了内核无法解决的严重错误, 这个时候计算机系统会越过 ACPI 等电源的设置迅速进行重启。
以下是一份 IDT 各种异常的对照表
OSDEV Exceptions OSDEV 网站有对异常中断作详细的解释
中断请求 (IRQ) 或硬件中断
这种类型的中断由芯片组在外部产生,并通过锁定到相关 CPU 的 #INTR 引脚或等效信号来发出信号。属于可屏蔽中断的一种。
8259A PIC
适用于新手 OS 开发者使用,配置方式非常简单,只需要通过几个 out
in
指令即可解决
- 优点:可快速使用,配置简易
- 缺点:中断都是一个一个发送的,只适用于单核 CPU
APIC
支持了中断并发,使多个 CPU 核心都可以处理中断
- 优点:中断可以发送至多个 CPU 核心,并发处理大幅度提高了效率
- 缺点:配置较为麻烦,对新手不太友好
PCI MSI (Message Signaled Interrupts)
该机制使 PCI 设备产生的中断无需通过 I/O APIC 转发,且支持多个设备多个中断,避免了接收到中断后还需通过检查设备寄存器来判断是哪一种设备,提高了处理效率
软中断
这类中断通常由用户程序触发,一般用于 Syscall 系统调用等功能,属于可屏蔽中断的一种
int <vector> ;x86 触发软中断的指令, vector代表中断向量号