Intel中断体系(1)中断与异常处理

news2024/11/28 3:47:13

文章目录

    • 概述
    • 中断与异常
      • 中断
        • 可屏蔽中断与不可屏蔽中断(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处理器手册》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不用创建项目,直接在 VS 里快速测试 C/C++ 代码

概述 Visual Studio 强大、方便,但是每次写代码都要先创建新项目,这对于一些简单的代码测试来说有点不方便。 本文介绍一种使用 VS 快速测试代码的方法。 该方法适用任何版本的 VS。“不用创建项目”,是指不用“手工”创建项目&#xff0c…

Python Scrapy 爬虫简单教程

1. Scrapy install 准备知识 pip 包管理Python 安装XpathCssWindows安装 Scrapy $>- pip install scrapy Linux安装 Scrapy $>- apt-get install python-scrapy 2. Scrapy 项目创建 在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中&am…

爆火出圈的ChatGPT,真的那么好用吗?

近期,ChatGPT在互联网行业爆火! 这个由人工智能研究和部署公司OpenAI开发的“交互机器人”,在今年1月其全球月活跃用户已达1亿,成为史上用户增长速度最快的消费级应用。 爆火的ChatGPT到底是什么? ChatGPT是一个原型人…

Java程序的执行顺序、简述对线程池的理解

点个关注,必回关 文章目录一、Java程序是如何执行的二、合理利用线程池能够带来三个好处一、Java程序是如何执行的 我们日常的工作中都使用开发工具(IntelliJ IDEA 或 Eclipse 等)可以很方便的调试程序,或者是通 过打包工具把项目…

删除Node.js,安装nvm,看这一篇就够了(有坑)

nvm的作用就是可以任意切换Node.js的版本,所以在下载nvm之前,现将系统中的Node.js全部删除,若之前没有安装过,可忽略第一步。 删除Node.js 一、程序和功能处找到Node.js,并删除 二、删除Node.js相关的目录文件 C:\Program Fil…

Science:北京脑研究中心李莹实验室揭示性满足感的分子机制

短暂的社交经历(例如,性经历)可导致内部状态的长期变化并影响社会行为,如交配、攻击。例如,在成功交配射精后,许多物种迅速表现出对交配倾向的抑制有数小时、数天或更长时间,这种效应称为性满足…

【报复性赚钱】2023年5大风口行业

今天就来和大家分享一下,在时代的洪流下,普通人如何顺应大势抓住机遇! 实现人在风口上,猪都会飞起来。 根据对市场的观察及各平台数据分析结果,结合国家政策和经济专家的分析,小编预测了2023年将会迎来大…

“1+1>2”!《我要投资》与天际汽车再度“双向奔赴”!

文|螳螂观察 作者| 图霖 胡海泉老师重磅回归、创始人现场真情告白……新一季的《我要投资》,不仅维持了往季在专业度上的高水准,也贡献了不少高话题度的“出圈”时刻。 在竞争激烈的的综艺节目竞技场,能举办数季的节目,往往都是…

Linux修改文件时间或创建新文件:touch

每个文件在Linux下面都记录了许多的时间参数,其实是三个主要的变动时间 修改时间(modification time,mtime):当该文件的【内容数据】变更时,就会更新这个时间,内容数据是指文件的内容&#xff…

Zabbix 构建监控告警平台(一)--部署安装

监控对象监控收集信息方式Zabbix 部署 1.监控对象 源代码: *.html *.jsp *.php *.py 数据库: MySQL,MariaDB,Oracle,SQL Server,DB2 应用软件:Nginx,Apache,PHP,Tomcat agent 集群: LVS,Keepalived,HAproxy…

期望风险, 经验风险和结构风险

经验风险模型关于所有训练集上的平均损失称为经验风险或经验损失.公式如下:至此, 我们通过计算单点误差损失的平均值来衡量(刻画)模型对训练集拟合的好坏, 但是我们如何衡量模型对未知数据的拟合能力呢, 也就是如何衡量模型在全体数据集上的性能, 因此我们引入概率论中两个随机…

终于周末啦,继续来总结一下Python的一些知识点啦

目录 Python概念梳理 常见概念梳理 Python经典判断题 判断题 选择题 Python概念梳理 常见概念梳理 Python中,不仅仅变量的值是可以变化的,类型也是可以随时变化的 1、Python的变量必须初始化否则提示 is not defined 2、if、while中定义的变量在…

【C++】static成员

💙作者:阿润菜菜 📖专栏:C 目录 概念 特性 出个题 概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量; 用static修饰的成员函数,称之为静态…

【Mysql第十二期 视图】

文章目录1. 常见的数据库对象2. 视图概述2.1 为什么使用视图?2.2 视图的理解3.大白话理解3.1 创建单表视图3.2 创建多表联合视图4. 查看视图5. 更新视图的数据5.1 一般情况6. 修改、删除视图6.1 修改视图6.2 删除视图7. 总结1. 常见的数据库对象 2. 视图概述 2.1 为…

Element UI框架学习篇(三)

Element UI框架学习篇(三) 实现简单登录功能(不含记住密码) 1 准备工作 1.1 在zlz包下创建dto包,并创建userDTO类(传输对象) package com.zlz.dto;import lombok.Data;/* DTO 数据传输对象 用户表的传输对象 调用控制器传参使用 VO 控制器返回的视图对象 与页面对应 PO 数据…

【一文速通】各种机器学习算法的特点及应用场景

近邻 (Nearest Neighbor)KNN算法的核心思想是,如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定…

一文讲解Linux 设备模型 kobject,kset

设备驱动模型 面试的时候,有面试官会问,什么是Linux 设备驱动模型?你要怎么回答? 这个问题,突然这么一问,可能你会愣住不知道怎么回答,因为Linux 设备驱动模型是一个比较整体的概念&#xff0…

使用DDD指导业务设计的总结思考

领域驱动设计(DDD) 是 Eric Evans 提出的一种软件设计方法和思想,主要解决业务系统的设计和建模。DDD 有大量难以理解的概念,尤其是翻译的原因,某些词汇非常生涩,例如:模型、限界上下文、聚合、…

VHDL语言基础-时序逻辑电路-计数器

目录 计数器的设计: 计数器的作用: 计数器的实现: 1、用“”函数描述: 用T触发器级联构成的串行进位的二进制加法计数器的仿真波形: 计数器的仿真: 计数器的设计: 计数是一种最简单基本的…

将.js文件转成vue标签结构的样式

例如:下图所示: 依次识别获取.js文件中的tag和props,可以理解为字符串拼接,将整个vue的标签结构看作是一个字符串。 话不多说,先放上完整代码,思路看代码备注。(自己实现的时候,可以…