当前位置: 首页 > news >正文

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断点;单步调试等
2NMI中断中断不可屏蔽外部中断
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页面错误故障任何内存引用
15Intel保留NANA
16#MFx87 FPU浮点错误故障x87 FPU浮点或WAIT/FWAIT指令
17#AC对齐检查故障对内存中任何数据的引用
18#MC机器检查异常终止与CPU类型有关
19#XFSIMD浮点异常故障SSE和SSE2浮点指令
20-31Intel保留NANANA
32-255用户定义中断中断外部中断或者INT n指令

中断描述符表

中断描述符表(IDT)包含了一个中断描述符的数组,每个中断描述符与特定的中断或异常向量对应,并指定了相关的中断处理例程。IDT中最多可包含256个描述符,处理器使用IDTR寄存器保存IDT表的位置。
在这里插入图片描述

中断描述符

中断描述符表包含3种类型的门描述符:

  • 任务门描述符:任务门描述符格式与GDT和LDT中任务门的格式相同,包含一个任务TSS段的选择符,该任务用于处理中断和异常;
  • 中断门描述符:中断门描述符包含指向中断异常处理过程的指针,中断触发时,处理器跳转到对应的中断异常处理程序的入口并执行;
  • 陷阱门描述符:陷阱门描述符包含的信息与中断门相通,唯一区别在于,通过陷阱门执行中断异常处理程序不会操作标志寄存器中的IF标志。

Intel 32位处理器中定义的中断描述符格式如下:
在这里插入图片描述

中断与异常处理

处理器对中断和异常处理过程的调用方法与使用Call指令调用程序过程的方法类似。当响应一个中断或异常时,处理器使用中断或异常向量作为中断描述符表中的索引,执行对应的中断异常处理程序或任务。
在这里插入图片描述

中断与异常处理过程

当处理器调用异常或中断处理程序时:

  • 如果处理程序程序将以低特权级执行,则会发生堆栈切换。发生堆栈切换时:
    1. 从当前执行任务的TSS中获取处理程序要使用的堆栈的段选择器和堆栈指针。在这个新堆栈上,处理器推送中断过程的堆栈段选择器和堆栈指针。
    2. 然后处理器将EFLAGS、CS和EIP寄存器的当前状态保存在新堆栈上,见下图;
    3. 如果异常导致保存错误代码,则将其推送到EIP值之后的新堆栈上。
  • 如果处理程序程序将以与中断程序相同的权限级别执行:
    1. 处理器将EFLAGS、CS和EIP寄存器的当前状态保存在当前堆栈上,见下图;
    2. 如果异常导致保存错误代码,则在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的主要作用是管理云平台上的资源&#xff…...

数据结构之二叉树

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

上海亚商投顾:三大指数集体调整 消费板块逆市活跃

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

【2023unity游戏制作-mango的冒险】-开始画面API制作

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

【微服务】Nacos配置管理

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

【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矩阵计算的深度值和深度图的值的大小,如果深度图值小的话&…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时,需要使用外部低速晶振...