这是图解系列之中断
我是cloud3
中断服务程序、
中断向量、
中断描述符表、
中断门。
这些名词在操作系统里经常提及
但是CPU是怎么使用他们的
他们之间又有何种联系呢
在前面文章图解中断 | 中断从产生到消失的一生中提到了中断的整个生命周期,其中有一个关键的环节是CPU在接收到中断向量号后是如何找到对应的中断服务程序的,今天我们就来一探究竟。
先准备些基础知识:
中断向量
首先看一下CPU接收到的这个中断向量。
为了区分不同的Interrupts和Exceptions,CPU要求必须为每一个Interrupt和Exception指定一个唯一的ID。
在Intel x86体系下,这个ID是[0, 255]范围内的数字,这个ID就被称作Interrupt/Exception Vector。
IVT/IDT表
CPU在保护模式下三个重要的系统表——GDT、LDT和IDT,与中断有关的就是IDT这张表了。
每一个Interrupt/Exception都可能会存在一中断服务程序Interrupt Service Routine(ISR),这些ISR可以被无规则的放置在内存中,但它们的入口地址,却会被按照固定的格式,按照对应的Vector Number,整齐的存放在内存中的一张表中。
这张表在Real Mode下,被叫做IVT(Interrupt Vector Table)。
在Protected Mode下,被叫做IDT(Interrupt Descriptor Table)。
其中IVT被放置在固定的位置[0H, 3FFH],而IVT可以放在内存中任意的位置,这个位置被保存在CPU的IDTR寄存器中。
IDT表内容
下面看一下中断描述符表IDT。
IDT是一个最大为256项的表,每个表项都是一个Gate Descriptors,为8字节,每一个Gate Descriptor对应一个Interrupt/Exceptions Vector。
IDT 表中可以存放三种类型的门描述符( 描述符的第40~43位用于区分不同的描述符):
中断门描述符
陷阱门描述符
任务门描述符
中断描述符表IDT将每个异常或中断向量与它们的处理程序联系起来。
无论哪种门,其作用都是实现控制转移,所以都包括16位的目标代码段选择子和32位的段内偏移量。
有了上面的准备就可以看一下CPU找中断服务程序的流程了。
下面是具体的流程:
CPU找到IDT表
CPU首先根据IDTR寄存器找到IDT表在内存中的位置。
找到门描述符
找到了IDT后再根据中断向量号乘以8就可以在IDT中找到对应的门描述符。
找到代码段描述符
门描述符的作用是实现控制转移,所以都包括16位的目标代码段选择子和32位的段内偏移量。根据目标代码段选择子就可以在GDT/LDT中找到代码段描述符了。
找到中断服务程序ISR
找到代码段描述符后,从代码段描述符中取出代码段的基地址,根据此基地址与门描述符中的段内偏移量,找到中断服务程序的入口地址,就可以执行代码了。
好了,如果感觉有用,记得下方点赞,
阅读更多关于操作系统的图解。
这是图解系列之中断
我是cloud3