异常、中断、陷阱

int 3 指令是常见的 断点中断,研究这个的时候发现个系统的一些机制有关。就研究了一下中断的分类,还有异常和陷阱。下面是我百度之后的一些总结:

中断的分类:外中断和内中断
根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。 根据中断源产生的条件,可把中断分为外中断和内中断。
外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。
内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。 为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。 除了在优先级的设置方面有区别之外,
中断和陷阱还有如下主要区别:

1、陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的。陷阱处理程序提供的服务为当前进程所用,而中断处理程序提供的服务则不是为了当前进程的。
2、中断是由硬件引起的,而异常是由软件引起。
3、中断是异步的,而异常是同步的。 CPU执行完一条指令之后,下一条指令开始之前响应中断,而在一条指令执行中也可以响应陷阱。例如执行指令非法时,尽管被执行的非法指令不能执行结束,但CPU仍可对其进行处理


硬中断和软中断:
1.软中断,也叫同步中断。软中断是由CPU执行中断产生指令时产生,是由程序预先实现好的,不是随机的。
  软中断是实现系统API函数调用的手段。
2.硬中断,也叫异步中断。硬中断是由硬件设备依照CPU时钟信号产生的,即意味着中断发生具有随机性和突发性,能够在指令正在执行时发生。例如键盘中断。


软中断产生源有两种:

1、硬中断处理程序产生。即:将硬中断处理程序分成"上半部"和"下半部"。上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作,然后产生软中断。下半部就是软中断处理程序,对时间要求不是非常紧急,通常比较耗时的,因此不在硬中断服务程序中执行。

如:打印机端口产生一个硬件中断时,会执行硬件中断处理程序,硬中断处理程序会产生一个软中断并送到操作系统内核里,在软中断处理程序中唤醒睡眠在打印任务队列的处理进程。

2、软件程序执行过程中,主动产生的软件中断。
如:程序执行过程出现异常时,主动调用abort()时,产生SIGABRT软中断。
如:执行系统调用sleep(),当睡眠时间到达时,通过软中断触发该进程被唤醒。


中断抢占:

1、硬中断可以被另一个优先级更高的硬中断“中断”,不会被同级(同一种硬中断)或低级的硬中断“中断”,更不会被软中断“中断”。

2、软中断可以被硬中断“中断”,但是不会被其它软中断“中断”。

3、在一个CPU上,软中断总是串行执行。所以在单处理器上,对软中断的数据结构进行访问不需要进行任何同步处理。但是,多个CPU可以同时执行软中断。

4、由硬中断产生的软中断,在硬中断执行完成后,会马上执行软新产生的软中断。但是,如果有其它软中断正在执行,为了保证上述第2点,会先判断当前是否在中断上下文中。如果是在中断上下文中,说明有其它中断正在执行,则不再执行该新产生的软中断,软中断处理程序需要依赖OS重新调度。


异常的类别:

(1)中断:中断是异步发生的,来自处理器外部IO设备的信号(区别于同步异常:执行一条指令的结果),它不是由任何一条专门的指令造成的。例如网络适配器、磁盘控制器通过向处理器芯片上的一个管脚发信号,并将异常号放在系统总线上,来触发中断,这个异常号标识了引起中断的设备。中断处理程序总是返回到当前指令的下一条指令。
(2)陷阱:陷阱是同步异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供系统调用接口。陷阱总返回到当前指令的下一条指令。
大家都知道,现代的CPU都是有优先级概念的,用户程序运行在低优先级,操作系统运行在高优先级。高优先级的一些指令低优先级无法执行。有一些操作只能由操作系统来执行,用户想要执行这些操作的时候就要通知操作系统,让操作系统来执行。用户态的程序就是用这种方法来通知操作系统的。
(3)故障:故障由错误引起,它可能被故障处理程序修正,如果修正成功,将返回到当前正在执行的指令,重新执行。否则处理程序返回到内核的abort历程,将终止故障程序。故障的一个典型是缺页异常。
(4)终止:由不可恢复的知名错误造成的结果,处理程序将返回到内核中的abort例程,终止应用程序。

中断描述符表(IDT)
将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。
IDT表可以驻留在线性地址空间的任何地方,
表中的每个表项占四个字节,由两个字节的段地址和两个字节的偏移量组成,这样构成的地址便是相应中断处理程序的入口地址。但是,在保护模式下,由四字节的表项构成的中断向量表显然满足不了要求。这是因为,除了两个字节的段描述符,偏移量必用四字节来表示;‚要有反映模式切换的信息。因此,在保护模式下,中断向量表中的表项由8个字节组成,中断向量表也改叫做中断描述符表IDT(InterruptDescriptor Table)。其中的每个表项叫做一个门描述符(gate descriptor),“门”的含义是当中断发生时必须先通过这些门,然后才能进入相应的处理程序。
主要门描述符是:
· 中断门(Interrupt gate)
其类型码为110,中断门包含了一个中断或异常处理程序所在段的选择符和段内偏移量。当控制权通过中断门进入中断处理程序时,处理器清IF标志,即关中断,以避免嵌套中断的发生。中断门中的DPL(Descriptor Privilege Level)为0,因此,用户态的进程不能访问Intel的中断门。所有的中断处理程序都由中断门激活,并全部限制在内核态。
· 陷阱门(Trap gate)
其类型码为111,与中断门类似,其唯一的区别是,控制权通过陷阱门进入处理程序时维持IF标志位不变,也就是说,不关中断。
· 系统门(System gate)
这是Linux内核特别设置的,用来让用户态的进程访问Intel的陷阱门,因此,门描述符的DPL为3。通过系统门来激活4个Linux异常处理程序,它们的向量是3、4、5及128,也就是说,在用户态下,可以使用int3、into、bound 及int0x80四条汇编指令。
最后,在保护模式下,中断描述符表在内存的位置不再限于从地址0开始的地方,而是可以放在内存的任何地方。为此,CPU中增设了一个中断描述符表寄存器IDTR,用来存放中断描述符表在内存的起始地址。中断描述符表寄存器IDTR是一个48位的寄存器,其低16位保存中断描述符表的大小,高32位保存IDT的基址.

原文地址:https://www.cnblogs.com/HsinTsao/p/6395570.html