Intel中断体系(1)中断与异常处理
文章目录
- 概述
- 中断与异常
- 中断
- 可屏蔽中断与不可屏蔽中断(NMI)
- 异常
- 异常分类
- 中断与异常向量
- 中断描述符表
- 中断描述符
- 中断与异常处理
- 中断与异常处理过程
- 堆栈切换
- 错误码
- 64位模式下的中断异常处理
- 64位中断描述符
- 64位处理器下的堆栈切换
- 相关参考
概述
中断是现代计算机普遍使用的一种机制,主要用于通知系统中出现了某一个事件,该事件需要处理器暂停当前的任务并进行处理。通常,当收到中断时,处理器会自动将当前正在执行的任务挂起,并运行中断处理程序;当处理器程序执行完毕后,处理器恢复并继续执行之前被中断的任务。
中断与异常
Intel处理器提供了两种中断程序执行的机制,分别称为中断和异常:
- 中断:中断发生在程序执行的任意时刻,以响应硬件发出的信号。系统硬件使用中断来处理外部事件,例如要求为外部设备提供服务;
- 异常:异常发生在处理器执行一条指令时,检测到一个出错条件,例如被0除出错时发生。处理器能够检测到各种出错条件,包括违反保护机制、页错误以及内存错误等。
由于中断是其它硬件信号按照处理器时钟信号随机产生的,也称为异步中断;而异常只有在一条指令终止执行后CPU才会发生中断,也称为同步中断。
中断
Intel处理器接收的中断来自于以下两种方式:
- 外部(硬件产生)中断:外部中断通过处理器上的引脚(INTR或NMI)或本地APIC接收;
- 软件中断:
int n
指令允许通过提供中断向量号作为指令操作数从软件内生成中断,典型的用例就是linux的系统调用,其通过指令int $0x80
向用户程序提供访问系统服务的接口。
可屏蔽中断与不可屏蔽中断(NMI)
通过处理器INTR引脚或通过本地APIC传递给处理器的任何外部中断都称为可屏蔽硬件中断,通过配置标志寄存器中IF标志可以实现对这类中断的屏蔽:
- 当IF标志被设置时,传送到INTR或通过本地APIC引脚的中断被处理为正常的外部中断;
- 当IF标志清除时,处理器禁止传送到INTR引脚或通过本地APIC的中断产生内部中断请求。
而对于不可屏蔽中断(NMI)则不受标志寄存器中IF标志影响,其通常来自于以下两种方式:
- 外部硬件通过处理器NMI引脚发送的中断;
- 处理器通过系统总线或者APIC使用NMI模式传递的信息。
另外,使用int n
指令在软件中产生的中断也不能被EFLAGS寄存器中的IF标志屏蔽。
异常
Intel处理器接收的异常来自于以下三种方式:
- 处理器检测到的程序错误异常:处理器在操作系统或应用程序执行期间,如果检测到程序错误,就会生成一个或多个异常;
- 软件生成的异常:INTO、INT 3和BOUND指令允许在软件中生成异常,这些指令会检查指令执行过程中指定点的异常情况,例如,INT 3指令会导致生成断点异常;
- 机器检查异常:当检测到机器检查错误时,处理器会发出机器检查异常信号(向量号18)并返回错误码。
异常分类
根据异常被报告的方式以及触发异常的指令是否能够被重新执行而不会丢失任务的连续性,异常可被细分成故障(Fault)、陷阱(Trap)和中止(Abort):
- Fault:Fault是通常可以被纠正的异常,并且一旦被纠正程序就可以继续执行。当出现Fault时,处理器将机器状态恢复到产生Fault的指令之前的状态,而Fault处理程序的返回地址会指向产生Fault的指令,而不是其后面一条指令,因此返回后Fault指令会被重新执行;
- Trap:Trap是一种引起陷阱的指令被执行后会立即报告的异常。Trap允许继续执行任务或程序而不丢失连续性。Trap处理程序的返回地址指向产生Trap的指令后的下一条指令;
- Abort:Abort是一种不会总是报告导致Abort的指令确切位置的异常,并且不允许导致异常的任务或程序重新继续执行。Abort用于报告严重错误,例如硬件错误以及系统表中的不一致或非法值。
中断与异常向量
Intel处理器将每个需要被处理器进行特殊处理的异常和中断条件都赋予了一个标识号,称为向量,用于唯一索引中断描述符表IDT中的描述符表项。Intel处理器允许的向量号范围是0~255,其中0~31的向量号保留用作处理器定义的中断和异常,32~255的向量号用于用户定义的中断。下表给出了Intel处理器定义的中断和异常的向量分配:
向量号 | 助记符 | 描述 | 类型 | 错误号 | 触发源 |
---|---|---|---|---|---|
0 | #DE | 除法错误 | 故障 | 无 | DIV或IDIV指令 |
1 | #DB | 调试异常 | 故障/陷阱 | 无 | 指令、数据或IO断点;单步调试等 |
2 | – | NMI中断 | 中断 | 无 | 不可屏蔽外部中断 |
3 | #BP | 断点 | 陷阱 | 无 | INT 3指令 |
4 | #OF | 溢出 | 陷阱 | 无 | INTO指令 |
5 | #BR | 越界 | 故障 | 无 | BOUND指令 |
6 | #UD | 未定义操作码 | 故障 | 无 | UD2指令或保留的操作码 |
7 | #NM | 设备不存在 | 故障 | 无 | 浮点或WAIT/FWAIT指令 |
8 | #DF | 双重错误 | 异常终止 | 有 | 任何可产生异常、NMI或INTR的指令 |
9 | – | 协处理器段越界(保留) | 故障 | 无 | 浮点指令 |
10 | #TS | 无效的任务状态段TSS | 故障 | 有 | 任务切换或访问TSS |
11 | #NP | 不存在的段 | 故障 | 有 | 加载段寄存器或访问系统段 |
12 | #SS | 堆栈段错误 | 故障 | 有 | 堆栈操作和SS寄存器加载 |
13 | #GP | 一般保护错误 | 故障 | 有 | 任何内存引用和其它保护检查 |
14 | #PF | 页面错误 | 故障 | 有 | 任何内存引用 |
15 | – | Intel保留 | NA | 无 | NA |
16 | #MF | x87 FPU浮点错误 | 故障 | 无 | x87 FPU浮点或WAIT/FWAIT指令 |
17 | #AC | 对齐检查 | 故障 | 有 | 对内存中任何数据的引用 |
18 | #MC | 机器检查 | 异常终止 | 无 | 与CPU类型有关 |
19 | #XF | SIMD浮点异常 | 故障 | 无 | SSE和SSE2浮点指令 |
20-31 | – | Intel保留 | NA | NA | NA |
32-255 | – | 用户定义中断 | 中断 | 外部中断或者INT n指令 |
中断描述符表
中断描述符表(IDT)包含了一个中断描述符的数组,每个中断描述符与特定的中断或异常向量对应,并指定了相关的中断处理例程。IDT中最多可包含256个描述符,处理器使用IDTR寄存器保存IDT表的位置。
中断描述符
中断描述符表包含3种类型的门描述符:
- 任务门描述符:任务门描述符格式与GDT和LDT中任务门的格式相同,包含一个任务TSS段的选择符,该任务用于处理中断和异常;
- 中断门描述符:中断门描述符包含指向中断异常处理过程的指针,中断触发时,处理器跳转到对应的中断异常处理程序的入口并执行;
- 陷阱门描述符:陷阱门描述符包含的信息与中断门相通,唯一区别在于,通过陷阱门执行中断异常处理程序不会操作标志寄存器中的IF标志。
Intel 32位处理器中定义的中断描述符格式如下:
中断与异常处理
处理器对中断和异常处理过程的调用方法与使用Call指令调用程序过程的方法类似。当响应一个中断或异常时,处理器使用中断或异常向量作为中断描述符表中的索引,执行对应的中断异常处理程序或任务。
中断与异常处理过程
当处理器调用异常或中断处理程序时:
- 如果处理程序程序将以低特权级执行,则会发生堆栈切换。发生堆栈切换时:
- 从当前执行任务的TSS中获取处理程序要使用的堆栈的段选择器和堆栈指针。在这个新堆栈上,处理器推送中断过程的堆栈段选择器和堆栈指针。
- 然后处理器将EFLAGS、CS和EIP寄存器的当前状态保存在新堆栈上,见下图;
- 如果异常导致保存错误代码,则将其推送到EIP值之后的新堆栈上。
- 如果处理程序程序将以与中断程序相同的权限级别执行:
- 处理器将EFLAGS、CS和EIP寄存器的当前状态保存在当前堆栈上,见下图;
- 如果异常导致保存错误代码,则在EIP值之后将其推送到当前堆栈上。
堆栈切换
处理器在执行中断异常处理程序时,在特权级不变和特权级发生改变的情况下,堆栈切换过程如下:
错误码
当异常条件与一个特定的段相关时,处理器会把一个错误码压入到异常处理过程的堆栈上,错误码的格式如下:
错误码包含一个段选择符以及3个标志位,其中3个标志位的作用如下:
- EXT:External event(bit 0),当设置时,表示在程序外部事件的传递过程中发生异常;
- IDT:Descriptor location(bit 1),当设置时,表示错误码的索引部分引用IDT中一个门描述符;当清除时,表示索引指向GDT或LDT中的一个段描述符;
- TI:GDT/LDT(bit 2),仅在IT标志清除时有效。当设置时,TI标志表示错误码的索引指向LDT中一个描述符;当清除时,则索引指向GDT中的描述符。
64位模式下的中断异常处理
64位模式下,中断与异常处理过程和非64位模式类似,差异点如下:
- IDT指向的所有中断处理程序入口地址使用64位;
- 中断堆栈推送的大小固定为64位;处理器使用8字节零扩展存储。
- 堆栈指针(SS:RSP)在中断时被无条件保存到新堆栈中。在传统模式中,会基于当前特权级别(CPL)的变化,处理过程不同;
- 如果CPL发生变化,则新SS设置为NULL;
- IRET行为变化;
- 有一种新的中断堆栈切换机制;
- 中断堆栈帧的对齐方式不同。
64位中断描述符
Intel 64位处理器下只定义了中断描述符和陷阱描述符,对应格式描述如下:
64位处理器下的堆栈切换
相关参考
- 《Linux内核完全注释》
- 《Intel处理器手册》
相关文章:

Intel中断体系(1)中断与异常处理
文章目录概述中断与异常中断可屏蔽中断与不可屏蔽中断(NMI)异常异常分类中断与异常向量中断描述符表中断描述符中断与异常处理中断与异常处理过程堆栈切换错误码64位模式下的中断异常处理64位中断描述符64位处理器下的堆栈切换相关参考概述 中断是现代计…...

财报解读:四季度营收超预期,优步却越来越“不务正业”了
“公司第四季度的业绩表现将是强劲的”。 公布2022年第三季度财报时,优步的高管给出了这样的预告,给资本市场打了一针“强心剂”。然而有人对此表示质疑,后疫情时代,带着新模式、新车型的全新网约车公司层出不穷,车企…...

C语言-程序环境和预处理(14.2)
目录 预处理详解 1.预定义符号 2. #define 2.1 #define定义标识符 2.2 #define 定义宏 2.3 #define 替换规则 注意事项: 2.4 #和## 2.5 带副作用的宏参数 2.6 宏和函数对比 3. #undef 4. 条件编译 4.1 单分支条件编译 4.2 多分支条件编译 4.3 判断是…...

VHDL语言基础-时序逻辑电路-计数器
目录 计数器的设计: 计数器的作用: 计数器的实现: 1、用“”函数描述: 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形: 计数器的仿真: 计数器的设计: 计数是一种最简单基本的…...

MySQL数据库07——高级条件查询
前面一章介绍了基础的一个条件的查询,如果多条件,涉及到逻辑运算,and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符 AND运算符只有当两边操作数均为True时,最后结果才为True。人们使用AND描述…...

《Terraform 101 从入门到实践》 第四章 States状态管理
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 军书十二卷,卷卷有爷名。 为什么需要状态管理 Terraform的主要作用是管理云平台上的资源ÿ…...

数据结构之二叉树
🎈一.二叉树相关概念 1.树 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合,树结构通常用来存储逻辑关系为 "一对多" 的数据。例如: 关于树的几个重要概念&…...

上海亚商投顾:三大指数集体调整 消费板块逆市活跃
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。市场情绪三大指数今日集体调整,沪指全天弱势震荡,创业板指盘中跌超1%。旅游、食品、乳业等大消费板块…...

【2023unity游戏制作-mango的冒险】-开始画面API制作
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:游戏制作 ⭐mango的冒险-开始画面制作⭐ 文章目录⭐mango的冒险-开始画面制作⭐👨&…...

【微服务】Nacos配置管理
🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 Nacos除了可以做配置管理,同样可以当作注册中心来使用。 了解注册中心用法点击跳转👉【微服务】Nacos注册中心 一.引入 当微服务部署的实例越来越多࿰…...

【C++】类与对象理解和学习(上)
专栏放在【C知识总结】,会持续更新,期待支持🌹类是什么?类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它(实例化后才…...

Pyqt5小案例,界面与逻辑分离的小计算器程序
直接看下最终效果: 使用技术总结 使用Designer设计界面 使用pyuic5命令导出到python文件 新建逻辑处理文件,继承pyuic5导出的文件的类,在里面编写信号与槽的处理逻辑 使用Designer设计界面 要使用Designer,安装一个Python库即…...

leaflet加载KML文件,显示图形(方法2)
第049个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载KML文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共66…...

Mysql 部署 MGR 集群
0. 参考文章 官方文档: MySQL :: MySQL 8.0 Reference Manual :: 18.2 Getting Started 博客: MGR 单主模式部署教程(基于 MySQL 8.0.28) - 墨天轮 (modb.pro) mysql MGR单主模式的搭建 - 墨天轮 (modb.pro) MySQL 5.7 基于…...

迁移至其他美国主机商时需要考虑的因素
网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量,并在谷歌的SERP中获得更好的排名。因此,在构建企业网站时,选择合适的主机商相当重要。不过就以美国主机为例,由于每个…...

【数据结构】第二章 线性表
文章目录第二章 知识体系2.1 线性表的定义和基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表的基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表的基本操作实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链…...

RESTful API 为何成为顶流 API 架构风格?
作者孙毅,API7.ai 技术工程师,Apache APISIX Committer 万物互联的世界充满着各式各样的 API ,如何统筹规范 API 至关重要。RESTful API 是目前世界上最流行的 API 架构风格之一,它可以帮助你实现客户端与服务端关注点分离&#x…...
Python基础知识点汇总(列表)
列表的含义 列表由一系列按特定顺序排列的元素组成,是Python中内置的可变序列。 **注:**列表的所有元素放在中括号[]中,相邻的两个元素用逗号分隔; 可将整数、实数、字符串、列表、元组等任何类型的内容放到列表中,且同一列表的元素类型可以不同。 列表的创建和删除 1.…...

新的一年软件测试行业的趋势能够更好?
如果说,2022年对于全世界来说,都是一场极大的挑战的话;那么,2023年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…...

Threejs中的Shadow Mapping(阴影贴图)
简而言之,步骤如下: 1.从灯光位置视点(阴影相机)创建深度图。 2.从相机的位置角度进行屏幕渲染,在每个像素点,比较由阴影相机的MVP矩阵计算的深度值和深度图的值的大小,如果深度图值小的话&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...