CPU如何确定硬件中断对应的中断服务程序?(以键盘为例)
这个问题问到点子上了——硬件中断的处理核心就是中断号和中断服务程序表的绑定关系,咱们一步步拆解,拿键盘举例子说清楚整个流程:
第一步:硬件先抛出带身份的请求
每个硬件设备(比如你的键盘)在设计阶段就被分配了一个唯一的中断请求号(IRQ),键盘默认是IRQ1。当你按下按键时,键盘的控制器(比如传统的PS/2控制器)会立刻向主板上的中断控制器(现在主流是APIC,老机器用PIC)发送这个IRQ信号,相当于喊一句:“嘿,我是键盘(IRQ1),有数据要处理!”
第二步:中断控制器做“翻译”工作
中断控制器收到IRQ后,会把它转换成CPU能直接识别的中断向量号——比如IRQ1通常对应向量号0x21(这个映射关系可以配置,但默认是固定的)。然后它会把这个向量号发给CPU,同时等待CPU的应答信号。
第三步:CPU根据向量号找对应的服务程序
当CPU发送应答、确认要处理这个中断后,会做这几件事:
- 暂停当前正在执行的指令,把当前的寄存器状态、程序计数器等信息压入栈中保存(也就是“保存现场”,方便处理完中断后回到原来的程序继续跑);
- 拿着中断控制器发来的向量号,去查系统初始化好的中断服务程序表:
- 如果是实模式(比如早期DOS系统),查的是中断向量表(IVT),这是内存开头1KB的区域,每个向量号对应4字节的地址,直接指向中断服务程序的入口;
- 如果是现在主流的保护模式/长模式(Windows、Linux等现代系统),查的是中断描述符表(IDT),每个条目不仅包含服务程序的地址,还有权限等额外信息,更安全灵活。
拿键盘举个完整的流程例子
你按下键盘上的字母A → 键盘控制器触发IRQ1 → 中断控制器把IRQ1翻译成向量号0x21 → CPU发送应答后收到这个向量号 → 查IDT中0x21对应的条目,找到键盘中断服务程序(ISR)的入口地址 → 跳转到这个ISR执行:程序会读取键盘的扫描码,把它转换成对应的ASCII字符,然后放到系统的输入缓冲区里 → ISR执行完毕后,CPU从栈中恢复之前保存的现场,回到之前正在运行的程序继续执行。
补充:操作系统的关键作用
这一切能跑通,离不开操作系统的初始化工作:系统启动时,会把各个硬件对应的中断服务程序的地址,提前填充到IVT/IDT中;同时还会和中断控制器配置好IRQ到向量号的映射关系。相当于操作系统提前给CPU做了一张“通讯录”,每个硬件的“编号”(向量号)都对应着处理它的“联系人”(服务程序)。
内容的提问来源于stack exchange,提问作者thirstForKnowledge




