中断机制 — 8259A 可编程中断控制器
tags: 操作系统, 中断@烩面
《操作系统真相还原》学习笔记:中断分类、中断描述符表 IDT、8259A 可编程中断控制器的工作原理与初始化。
中断的定义
CPU 获知了计算机中发生的某些事,暂停正在执行的程序,转而去执行处理该事件的程序,处理完毕后继续执行刚才的程序。整个过程称为中断处理。
并发和并行
- 并发:单位时间内的累积工作量(单核 CPU 谈并发)
- 并行:真正同时进行的工作量(多核 CPU 谈并行)
中断的分类
外部中断(硬件中断)
来自 CPU 外部的中断,中断源必须是某个硬件。

CPU 中有两条接收中断的信号线:
- INTR:可屏蔽中断,不影响系统运行,CPU 可以不处理
- NMI:不可屏蔽中断,致命错误,系统无法继续运行
内部中断(软中断)
由软件主动发起的中断。
中断描述符表 IDT
保护模式下用于存储中断处理程序入口的表。
门描述符
| 类型 | 说明 |
|---|---|
| 任务门 | 用于硬件任务切换,需配合 TSS |
| 中断门 | IF 位自动置 0,关闭中断嵌套 |
| 陷阱门 | IF 位不变,允许中断嵌套 |
| 调用门 | 用户进程进入特权 0 级的方式 |
除调用门外,任务门、中断门、陷阱门都可以存在于 IDT 中。
lidt 指令
lidt 加载 48 位内存数据:前 16 位是 IDT 表界限,后 32 位是 IDT 线性基地址。

中断处理过程
CPU 外部
外部设备的中断由中断代理芯片接收,处理后将该中断的中断向量号发送到 CPU。
CPU 内部
- 处理器根据中断向量号定位中断门描述符
- 处理器进行特权级检查(检查 CPL 与目标代码段 DPL)
- 执行中断处理程序
从中断返回
iret 指令从栈顶弹出数据到各寄存器,从中断处理程序返回。
8259A 可编程中断控制器
负责所有来自外设的中断,管理和控制可屏蔽中断,包括屏蔽外设中断、优先级判决、向 CPU 提供中断向量号。

| 组件 | 功能 |
|---|---|
| INT | 选出最高优先级中断,通知 CPU |
| INTA | 接受 CPU 的中断响应信号 |
| IMR | 中断屏蔽寄存器 |
| IRR | 中断请求寄存器,锁存等待处理的中断 |
| PR | 优先级仲裁器 |
| ISR | 中断服务寄存器,保存正在处理的中断 |
初始化 8259A
ICW(初始化命令字):
- ICW1:设置连接方式和中断触发方式
- ICW2:设置起始中断向量号
- ICW3:级联配置(主从片互连)
- ICW4:工作模式设置
OCW(操作命令字):
- OCW1:屏蔽外设中断信号
- OCW2:设置中断结束方式和优先级模式
- OCW3:特殊屏蔽方式及查询方式
时钟
使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就称为定时或时钟。
内部时钟
内部时钟是指处理器中内部元件,如运算器、控制器的工作时序,主要用于控制、同步内部工作过程的步调。
外部时钟
外部时钟是指处理器与外部设备或外部设备之间通信时采用的一种时序。
可编程定时计数器 8253
计数器结构
- CLK:时钟输入信号,即计数器自己工作的节拍。每当此引脚收到一个时钟信号,减法计数器就将计数值减 1
- GATE:门控输入信号,在某些工作方式下用于控制计数器是否可以开始计数
- OUT:计数器输出信号。当定时工作结束,即计数值为 0 时,根据计数器的工作方式,在 OUT 引脚输出相应的信号
- 计数初值寄存器:用来保存计数器的初始值
- 计数器执行部件:计数器中真正"计数"的部件,计数的工作是由计数器执行部件完成的
- 输出锁存器:也称为当前计数值锁存器,用于把当前减法计数器中的计数值保存下来,目的是让外界可以随时获取当前计数值
计数器工作条件
计数器开始计数需要两个条件:
- GATE 为高电平,即 GATE 为 1,这是由硬件来控制的
- 计数初值已写入计数器中的减法计数器,这是由软件 out 指令控制的
当这两个条件具备后,计数器将在下一个时钟信号 CLK 的下降沿开始计数。