Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >中断机制和中断描述符表、中断和异常的处理

中断机制和中断描述符表、中断和异常的处理

作者头像
s1mba
发布于 2017-12-28 07:46:43
发布于 2017-12-28 07:46:43
3.9K0
举报
文章被收录于专栏:开发与安全开发与安全

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。

此书已经开源,阅读地址 http://www.kerneltravel.net

1、中断向量

Intel x86 系列微机共支持256 种向量中断,为使处理器较容易地识别每种中断源,将它们从0~255 编号,即赋予一个中断类型码 n,Intel 把这个8 位的无符号整数叫做一个向量,因此,也叫中断向量。所有256 种中断可分为两大类:异常和中断。异常又分为故障(Fault)、陷阱(Trap)和夭折(Abort),它们的共同特点是既不使用中断控制器,又不能被屏蔽。中断又分为外部可屏蔽中断(INTR)和外部非屏蔽中断(NMI),所有I/O 设备产生的中断请求(IRQ)均引起屏蔽中断,而紧急的事件(如硬件故障)引起的故障产生非屏蔽中断。

非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的编程来改变。Linux 对256 个向量的分配如下。

• 从0~31 的向量对应于异常和非屏蔽中断。

• 从32~47 的向量(即由I/O 设备引起的中断)分配给屏蔽中断。

• 剩余的从48~255 的向量用来标识软中断。Linux 只用了其中的一个(即128 或0x80向量)用来实现系统调用。当用户态下的进程执行一条int 0x80 汇编指令时,CPU 就切换到内核态,并开始执行system_call() 内核函数。

2、外设可屏蔽中断、异常及非屏蔽中断

Intel x86 通过两片中断控制器8259A 来响应15 个外中断源,每个8259A 可管理8 个中断源。第1 级(称主片)的第2 个中断请求输入端,与第2 级8259A(称从片)的中断输出端INT 相连,如图3.1 所示。我们把与中断控制器相连的每条线叫做中断线,要使用中断线,就得进行中断线的申请,就是IRQ(Interrupt ReQuirement ),我们也常把申请一条中断线称为申请一个IRQ 或者是申请一个中断号。IRQ 线是从0 开始顺序编号的,因此,第一条IRQ线通常表示成IRQ0。IRQn 的缺省向量是 n+32;如前所述,IRQ 和向量之间的映射可以通过中断控制器端口来修改。

异常就是CPU 内部出现的中断,也就是说,在CPU 执行特定指令时出现的非法情况。非屏蔽中断就是计算机内部硬件出错时引起的异常情况。从图3.1 可以看出,二者与外部I/O接口没有任何关系。Intel 把非屏蔽中断作为异常的一种来处理,因此,后面所提到的异常也包括了非屏蔽中断。Intel x86 处理器发布了大约20 种异常,Linux 内核必须为每种异常提供一个专门的异常处理程序,它们通常把一个UNIX 信号发送到引起异常的进程。

3、中断描述符表

在实地址模式中,CPU 把内存中从0 开始的1K 字节作为一个中断向量表。表中的每个表项占4 个字节,由两个字节的段基址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。在实模式下,中断向量表中的表项由8 个字节组成,如图3.2 所示,中断向量表也改叫做中断描述符表IDT(Interrupt Descriptor Table)。其中的每个表项叫做一个门描述符(Gate Descriptor),“门”的含义是当中断发生时必须先通过这些门,然后才能进入相应的处理程序。

其中类型占3 位,表示门描述符的类型,这些描述符如下。

1.任务门(Task gate)

其类型码为101,门中包含了一个进程的TSS 段选择符,但偏移量部分没有使用,因为TSS本身是作为一个段来对待的,因此,任务门不包含某一个入口函数的地址。TSS 是Intel 所提供的任务切换机制,但是 Linux 并没有采用任务门来进行任务切换。

2.中断门(Interrupt gate)

其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清IF 标志,即关中断,以避免嵌套中断的发生。中断门中的DPL(Descriptor Privilege Level)为0,因此,用户态的进程不能访问Intel 的中断门。所有的中断处理程序都由中断门激活,并全部限制在内核态。

3.陷阱门(Trap gate)

其类型码为111,与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持IF 标志位不变,也就是说,不关中断。

4.系统(调用)门(System gate)

这是Linux 内核特别设置的,用来让用户态的进程访问Intel 的陷阱门,因此,门描述符的DPL 为3。通过系统门来激活4 个Linux 异常处理程序,它们的向量是3、4、5 及128,也就是说,在用户态下,可以使用int 3、into、bound 及int 0x80 四条汇编指令。

最后,在保护模式下,中断描述符表在内存的位置不再限于从地址0 开始的地方,而是可以放在内存的任何地方。为此,CPU 中增设了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR 是一个48 位的寄存器,其低16位保存中断描述符表的大小,高32 位保存IDT 的基址,如图3.3 所示。

Linux 内核在系统的初始化阶段要进行大量的初始化工作,其与中断相关的工作有:初始化可编程控制器8259A;将中断向量IDT 表的起始地址装入IDTR 寄存器,并初始化表中的每一项。

用户进程可以通过INT 指令发出一个中断请求,其中断请求向量在0~255 之间。为了防止用户使用INT 指令模拟非法的中断和异常,必须对IDT 表进行谨慎的初始化。其措施之一就是将中断门或陷阱门中的DPL 域置为0。如果用户进程确实发出了这样一个中断请求,CPU 会检查出其CPL(3)与DPL(0)有冲突,因此产生一个“通用保护”异常。

但是,有时候必须让用户进程能够使用内核所提供的功能(比如系统调用),也就是说从用户空间进入内核空间,这可以通过把中断门或陷阱门的DPL 域置为3 来达到。

4、中断和异常的处理

当CPU 执行了当前指令之后,CS 和EIP 这对寄存器中所包含的内容就是下一条将要执行指令的逻辑地址。在对下一条指令执行前,CPU 先要判断在执行当前指令的过程中是否发生了中断或异常。如果发生了一个中断或异常,那么CPU 将做以下事情。

• 确定所发生中断或异常的向量 i(在0~255 之间)。

• 通过IDTR 寄存器找到IDT 表,读取IDT 表第 i 项(或叫第i 个门)。

• 分两步进行有效性检查:首先是“段”级检查,将CPU 的当前特权级CPL(存放在CS寄存器的最低两位)与IDT 中第 i 项中的段选择符中的RPL 相比较,如果RPL(3)大于CPL(0),就产生一个“通用保护”异常(中断向量13),因为中断处理程序的特权级不能低于引起中断的程序的特权级。这种情况发生的可能性不大,因为中断处理程序一般运行在内核态,其特权级为0。然后是“门”级检查,把CPL 与IDT 中第 i 个门的DPL 相比较,如果CPL (3)大于DPL(0),CPU 就不能“穿过”这个门,于是产生一个“通用保护”异常,这是为了避免用户应用程序访问特殊的陷阱门或中断门。但是请注意,这种检查是针对一般的用户程序引起的中断(INT 指令),而不包括外部I/O 产生的中断或因CPU内部异常而产生的异常,也就是说,如果产生了中断或异常,就免去了“门”级检查。

• 检查是否发生了特权级的变化。若中断发生时CPU运行在用户空间,而中断处理程序运行在内核态,特权级发生了变化,所以会引起堆栈的更换。也就是说,从用户堆栈切换到内核堆栈。而当中断发生在内核态时,即CPU 在内核中运行时,则不会更换堆栈。

CS : EIP 的值就是IDT 表中第i 项门描述符的段选择符和偏移量的值,此时,CPU 就跳转到了中断或异常处理程序。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-09-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
呜呜祖啦滤波器FPGA实现
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
7690
呜呜祖啦滤波器FPGA实现
基于FPGA的均值滤波(三)
基于FPGA的均值滤波(三) 之二维求和模块 在实现了窗口内一维行方向上的求和操作,现在要得到整个窗口内的像素之和,还必须将每一行的计算结果再叠加起来。但是每一行的计算结果就不可以使用上面的增量更新的
瓜大三哥
2018/02/26
9620
基于FPGA的均值滤波(三)
荐读:FPGA设计经验之图像处理
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
1.4K0
荐读:FPGA设计经验之图像处理
有趣的算法(十一) ——分治法:快速​求最值
有趣的算法(十一)——分治法:快速求最值 (原创内容,转载请注明来源,谢谢) 一、需求 一个数组,里面有若干的数字,现需要得到这一组数字的最大值和最小值。 二、简单分析 最基本的做法,是两两比对,可以区分出临时的最大值和最小值,再拿临时的最大值和最小值往后比较,有新的最值则更新。总的需要的比较次数是2n-2。 三、优化 使用分治法快速求最值。即把数组分到最小的1-2个数,两两比较后,仅将最大值和最小值回传,再两两比较最值,回传新的最值,最终得出最大值和最小值。 分析需要比较的次数。当数组只有1个数时,
用户1327360
2018/03/07
1.7K0
leetcode-747-Largest Number At Least Twice of Others(求vector的最大值和次大值)
题目描述: In a given integer array nums, there is always exactly one largest element. Find whether the largest element in the array is at least twice as much as every other number in the array. If it is, return the index of the largest element, otherwise retur
chenjx85
2018/05/21
6980
基于FPGA灰度图像的形态学腐蚀
数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的蓬勃发展,其并行快速,易于硬件实现,目前已经在计算机视觉、信号处理与图像分析、模式识别等方面得到了极为广泛的应用。
FPGA开源工作室
2019/10/29
9190
基于FPGA灰度图像的形态学腐蚀
形态学滤波(五)
形态学滤波(五) 之一维形态学腐蚀/膨胀子模块设计 对于图像处理而言,是纵向和横向两个维度的处理。我们知道,对于任何二维的操作,都可以分解为一维方向的操作来简化来设计。在图像处理中,习惯是首先横向处理,然后纵向处理。所谓横向处理就是对每一行进行处理。对于尺寸nxn的处理窗口可以采用一个1xn的窗体从图像第一行第一列开始,自左向右滑动,依次取出窗口内的n个限售股灰度值,比较得到灰度最小值或者最大值并按顺序存储。 以处理窗口尺寸为5说明,要完成5个数据的比较,可以在一个时钟完成两对数据的比较,第二个时钟完成上述
瓜大三哥
2018/02/26
6140
形态学滤波(五)
基于FPGA的均值滤波(二)
基于FPGA的均值滤波(二) 之一维求和模块 均值滤波按照整体设计可以分为以下几个子模块: (1)一维求和模块,这里记为sum_1D; (2)二维求和模块,这里记为sum_2D; (3)除法转换模块,此模块比较简单,一般情况下不进行模块封装。 (4)行缓存电路实现行列间像素对齐。 整个顶层模块调用sum_2D模块和除法转换电路求取平均值,记为mean_2D。 用FPGA来求和是最简单的事情,所要注意的是求和结果不要溢出。一般情况下,2个位宽为DW的数据想家,至少得用一个DW+1位宽的数据来存放。 假设窗口尺
瓜大三哥
2018/02/26
1.5K0
基于FPGA的均值滤波(二)
基于FPGA的自动白平衡算法的实现(附代码)
对于白平衡基本概念的详细介绍请查看文章《白平衡初探》,白平衡算法主要的作用是将偏暖或者偏冷的色调自动恢复到正常色调,是图像看起来更加色彩饱满正常。
FPGA技术江湖
2021/04/07
2K0
基于FPGA的自动白平衡算法的实现(附代码)
图像分割(五)
图像分割(五) 之基于FPGA的局部自适应分割 子模块设计 数据累加模块add_tree 数据累加模块负责将窗口内所有元素与均值之差的平方相加,这里还是采用以前的加法思路:每个加法器限制两个输入,这样
瓜大三哥
2018/02/26
6620
图像分割(五)
基于FPGA的非线性滤波器(三)
基于FPGA的非线性滤波器(三) 之并行全比较排序模块设计 由于排序运算在图像的行列方向上是同性的,因此,同时考虑首先进行一维图像方向上的排序,再对列方向上的行排序结果进行排序,即可得到一个窗口内的排序结果。 一维方向的排序运算模块,记为sort_1d。同样地,对于最终的二维排序运算模块,记为sort_2d。 1.sort_1d模块设计 计算步骤如下: (1)首先得到待排序的n个数据:这可以通过将数据流打n-1拍实现。 (2)进行全比较:当前数据与其他所有一次进行比较,并记录比较结果,比较的过程需先考虑输入
瓜大三哥
2018/02/26
7450
基于FPGA的非线性滤波器(三)
基于FPGA的直方图拉伸
在视频处理中,为了能够实时调节图像的对比对,通常需要对直方图进行拉伸处理。直方图拉伸是指将图像灰度直方图较窄的灰度级区间向两端拉伸,增强整幅图像像素的灰度级对比度,达到增强图像的效果。
FPGA开源工作室
2019/12/18
1.2K0
形态学滤波(六)
形态学滤波(六) 之二维形态学腐蚀/膨胀子模块设计 按照二维扩展的思路,将每一行的一维算子的计算结果对齐在列方向上再进行一维运算,得到的结果即是二维运算结果。 上面的结构图中涉及到: (1)minma
瓜大三哥
2018/02/26
7300
形态学滤波(六)
题解 | Verilog刷题解析及对应笔试面试注意点【6-9】(涉及==和===、for展开问题等)
目的:不仅仅是解题,更多的是想从真实的FPGA和数字IC实习秋招和实际工程应用角度,解读一些【笔试面试】所注意的知识点,做了一些扩展。
FPGA探索者
2022/05/26
1.3K0
题解 | Verilog刷题解析及对应笔试面试注意点【6-9】(涉及==和===、for展开问题等)
谁能想到,求最值的算法还能优化?
今天主要来聊两个问题:给一个数组,如何同时求出最大值和最小值,如何同时求出最大值和第二大值?
labuladong
2021/09/23
8650
LeetCode 第 18 场双周赛(188/587,前32%)
题目链接 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
Michael阿明
2020/07/13
7590
LeetCode 第 18 场双周赛(188/587,前32%)
求最大最小值,最少要进行多少次比较? | 经典面试题
(3)两个子数组的最大值里再取最大值,两个子数组的最小值里再取最小值,就是最终解;
架构师之路
2021/11/10
9580
图像分割(四)
图像分割(四) 之基于FPGA的局部自适应分割 子模块设计 窗口缓存模块win_buf 本模块不做任何算法上的处理,只是负责将当前输入像素的二维窗口元素缓存并组成一个一维的向量输出。 模块的构建非常简
瓜大三哥
2018/02/26
8660
图像分割(四)
Greedy & Violent
1 2 3//坐标缩小后就可以更方便的选择 double pos = (double)i / n * (n + m);//原来雕像的位置 ans += fabs(pos - floor(pos + 0.5))/(n + m);//*n+m后就选四舍五入最近的
radaren
2018/08/28
5580
影响FPGA时序的进位链(Carry Chain), 你用对了么??
在FPGA中我们写的最多的逻辑是什么?相信对大部分朋友来说应该都是计数器,从最初板卡的测试时我们会闪烁LED,到复杂的AXI总线中产生地址或者last等信号,都会用到计数器,使用计数器那必然会用到进位链。
猫叔Rex
2020/06/29
2.1K0
推荐阅读
相关推荐
呜呜祖啦滤波器FPGA实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档