前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解中断 | 没想到中断服务程序隐藏的这么深

图解中断 | 没想到中断服务程序隐藏的这么深

作者头像
虚拟化云计算
发布2023-03-27 15:54:56
4760
发布2023-03-27 15:54:56
举报
文章被收录于专栏:虚拟化云计算

这是图解系列之中断

我是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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 虚机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档