可编程中断控制器
中断本质上就是一种信号,信号通知到对方以此完成某种动作的执行回调,这对于 Java层面上,亦或是 os皆如此,或者说其实这是对 cs而言是通用的,对应的便是信号-通知机制
本篇来描述下 cpu是如何感知外中断
,处理中断,引入新概念:中断引脚 INTR、可编程中断控制器
IRQ中断请求,cpu物理结构中外围有一层触角,即中断引脚 INTR,IRQ触发时会来到 cpu中断引脚处,而 cpu要去做的便是在适当的去检查引脚处是否有中断信号去处理即可,如在每条指令执行完的末尾
考虑个问题:cpu同一时间能处理的中断只有一个,若同一个时间点多个触角上同时来个多个 IRQ,此时该如何协调?
这种情况下,需要对中断请求信号进行算法层面的调度,筛选出适当的中断信号优先去执行
因此,引入了可编程中断控制器(8259A)
,其会对中断信号进行优先级排序,cpu优先执行高优先级的中断信号,处理完对应请求后,再去执行下一个 IRQ,周而复始,直到处理完所有设备的中断请求
中断控制器默认有八个触角,各自对应一个设备,但实际上机器设备远远不止八台,因此中断控制器之间可进行级联,即两个级联之后便可以去标识 64个设备对应中断编号
对于中断控制器,其包含了三个部分:中断请求控制器、优先级解析器、正在服务寄存器
中断请求寄存器
存放所有 IRQ信号对应标识位
而 cpu同时能去处理的 IRQ有限,默认情况下会优先处理低位编码对应中断,即这是优先级解析器
会去干的事,而如何标识高优先级的中断正在处理呢?通过正在服务寄存器
里头保存正在处理的中断编号,处理完后则去清空里头保存的值,然后告知 cpu去处理下一个高优先级中断
那么 cpu是如何去感知设备中断类型以及进行响应处理的呢?
os在内核启动时会去加载 IRQ 中断入口程序向量表
,里头对通过编号来去标识每一个 IRQ,每一个编号会去对应入口程序的代码段地址,当编程中断控制器中的优先级解析器筛选出要去执行的 IRQ时,会去通知 cpu对之执行,而 cpu此时会接收到该中断能对应编码,然后到内核态中的中断入口程序向量表中寻找到与之对应的入口程序代码段地址,然后予以执行,完成中断的处理,周而复始