哈工大操作系统 IA-32白皮书读书笔记Note3

中断和异常处理

1 中断和异常处理概述

1.1 什么是中断和异常

中断和异常是在正在执行的程序和任务中出现的一些,需要处理器来腾出手处理的情况。

  • 中断

中断可能出现在程序执行的任何时间,来响应硬件发出的中断信号。硬件使用中来处理处理器外部的时间,例如处理外围设备提供服务的请求。

  • 异常

异常通常出现在处理器执行一条指令时发现错误(例如除零错误)的时候。处理器还能诊断出来的错误有违反保护、页错误、内部机器错误等等。

1.2 处理器如何处理

当收到一个中断或者检测到异常的时候,最近正在运行的程序将被暂时挂起。与此同时,处理器会转而执行中断处理或者异常处理程序。当处理程序完成之后,处理器就会回复被挂起的程序。

2 有关中断和异常了解性的内容

2.1 中断和异常向量

为了帮助处理中断和异常,每一个架构级定义的,需要处理器来特殊处理的中断或异常都被分配了一个独一无二的号码,称之为中断向量。处理器就用这个向量号在中断描述符符号表(IDT) 中找到中断异常处理函数的入口来执行相应的处理程序。

0-255的向量号是架构中允许使用的号码范围。其中0-31是保留给IA-32系统,用作架构级定义的中断异常的标识;而32-155是留给用户,可被用户定义的向量号。下图是架构保留的向量号,其中一些已经分配了中断异常,另一些则作为保留。

p9PMHw8.png
p9PM7ef.png

2.2 中断源合异常源

2.2.1 外部中断

外部中断源是指有CPU外部时间引发的中断。外部中断通过处理器上的引脚或者通过本地APIC接收。当本地APIC被启用时,LINT[1: 0]引脚可以通过APIC的本地向量表(LVT)进行编程从而与处理器的任何异常或中断向量相关联;而当本地APIC被仅用时,这些APIC分别被配置为INTR和NMI引脚。处理器的本地APIC用场连接到基于系统的I/O APIC,I/O APIC决定中断向量数。LINT[1: 0]引脚在不包含本地APIC的处理器上不可用,这些处理器的外部中断通常基于系统的中断控制器产生,这些中断通过INTR引脚发出中断信号。

2.2.2 可屏蔽硬件中断

任何通过INTR或着局部APIC传递到处理器的中断信号都被称为可屏蔽硬件中断。可屏蔽硬件终端包括所有的IA-32系统级定义的所有0-255割中断向量以及那些可以通过APIC发送的16-255号中断。

2.2.3 软件中断

使用指令INT n允许从软件内部发出一个中断信号,并且需要提供相应的中断向量号作为操作数,例如指令INT 35就是发出35号代表的中断。所有的0-255号中断都可以用作INT n的参数。然而,如果调用的是NMI向量,处理则会有一些不同,处理程序被调动但是相应的硬件却不会被激活。通过指令INT n发出的中断不可以呗EFLAHS寄存器中的IF标志位屏蔽掉

2.2.4 程序错误异常

处理器在执行程序的时候如果检测到了一个错误,则会生成一个或多个异常。IA-32架构为每一个可检测的异常分配了一个异常号,异常又分为故障、陷阱和中止

2.2.5 软件异常

可以使用指令INTOINT 3BOUND在软件中产生一个异常INT n指令可以用来模拟软件中的异常,但是需要注意:如果INT n为为一个架构级异常提供了一个向量号,处理器将生成一个正确的中断向量但不会向栈中压入一个错误代码。也就是说,在处理异常的时候,异常处理程序仍然会尝试从堆栈中弹出一个错误代码。因为当时没有将错误代码压入栈,因此异常处理程序会被丢弃,从而返回一个错误的位置。

2.2.6 机器检查异常

处理器内部有机器检查的机制,当检测到机器错误时,处理器就会发出一个机器检查异常。此时,处理器会发送及其异常信号,也就是18号向量,并且返回错误代码。

2.3 异常的分类:故障、陷阱和中止

  • 故障

故障一般都可以得到修正,而且一旦得到修正就可以重启程序并且保持程序的连贯性。报告故障时,处理器会恢复到故障指令之前的状态,故障处理程序会返回到故障指令所在位置,而不是故障指令后面

  • 陷阱

陷阱一经发现就立刻报告并进行处理。陷阱允许当前程序或者任务继续执行,处理结束后返回到捕获陷阱指令之后的指令,继续执行

  • 中止

中止一般会报告一个十分严重的错误,例如硬件错误。他通常不会报告异常出现的具体位置,一般也不会重启中断的任务或程序。

2.4 程序或任务的重新执行

对于故障,返回位置指向故障所在指令行,返回值指针在处理器生成异常的时候保存。因此,在程序或任务经过异常处理之后,会重新再执行一遍故障指令。重新执行错误指令一般用于处理操作数访问错误,最常见的例子就是缺页故障。经过处理之后,处理程序会将相应的页加载到内存中,从而解决问题,在此执行这个指令就不会出错。

对于陷阱,返回位置在陷阱的后面,但是如果在跳转指令期间检测到陷阱,则会跳转到跳转指令指向的应当条转过去的地方,而不是跳转指令的后一句,例如JMP指令。陷阱异常通常都会允许程序或者任务在处理之后正常重新启动。

对于中止,一般来讲,不支持从中止中重新启动或者返回程序任务中。中止处理程序旨在在中止发生的时候手机有关程序状态的诊断信息,然后尽可能优雅的退出程序和系统。

2.5 开启和禁止中断

2.5.1 屏蔽可屏蔽硬件中断

IF标志位用来禁用处理器INTR引脚或者本地APIC接受到的可屏蔽硬件中断。IF = 0时,处理区禁止通过本地APIC或者INTR引脚传送的中断;IF = 1则允许。但是IF标志位不会影响NMI,也不影响处理器生成的异常。和其他标志寄存器中的标志一样,在硬件重启的时候,IF会擦除。

可以使用指令ITICLI来设置或者清楚IF标志.

2.5.2 屏蔽指令断点

标志位寄存器中的RF标志用来控制处理器对指令断点的相应。当设置的时候,他就会尝试阻止指令断点生成调试异常;清除时,指令断点则会正常生成调试异常。

2.5.3 在切换堆栈时屏蔽异常和中断

切换堆栈使用一对指令,例如:

MOV SS, AX
MOV ESP, StackTop

为了避免在段选择符加载到SS寄存器后,ESP寄存器前出现异常导致的逻辑地址不已知问题,处理器会阻止在两个MOV指令中出现的中断和异常。

2.6 异常和中断的优先级

如果同时出现了多个终端,处理器显然要分个先后来处理他们,处理的优先级如下表所示:

p9i3Wd0.md.png

3 中段描述符表

3.1 如何构成

中段描述符表将每一个中断异常向量和一个门描述符联系起来,用来处理相关的中断或是异常。与GDT不同的是,IDT的第一个条目是允许放置一个描述符的。为了在IDT中形成索引,处理器会以8为单位压缩中断异常向量,这样的话可以和门描述符的字节对齐。

p9i81wq.png

3.2 如何获得中断处理程序地址

通过中段描述符基地址加便宜的形式获得中断处理程序的地址。需要注意的是,IDT的基地址应该在一个8字节的边界处对齐。

3.3 如何设置中段描述符寄存器

可以分别使用指令LIDTSIDT加载和存储IDTR的内容。LIDT指令可以基地址加操作数偏移来加载到IDRT,但此指令只能在CPL 0等级使用SIDT指令可以将存储在IDTR中的基地址和偏移量存储到内存中。

p9iGFc4.md.png

4 IDT描述符

下图为各个类型描述符,其中缩写为:

  • DPL:中段描述符权限等级
  • Offset:偏移量
  • P:P标志位
  • Selector:段选择符位置代码段
  • D:粒度,1 = 32bits;0 = 16bits

阴影部分为保留位。

4.1 中断门

p9iGcEq.png

4.2 陷阱门

p9iGgU0.png

4.3 任务门

p9iGybn.png

5 中断与异常处理

5.1 中断过程调用的流程

当响应异常或中断时,处理器使用异常或中断向量作为IDT中描述符的索引。如果索引指向中断门或陷阱门,处理器调用异常或中断处理程序的方式类似于调用门的CALL;如果index指向一个任务门,处理器执行一个任务切换到异常或中断处理程序任务,方式类似于CALL到任务门。

p9iYgpT.md.png

5.2 如何判断中断处理过程与被中断任务的优先级

通过中断描述符的权限等级和当前执行的任务CPL来判断。

5.3 不同优先级上,处理方式一样吗

不一样,如果从低等级到高等级切换的话需要进行栈的切换。

5.4 & 5.5 栈切换问题

当处理器执行对异常或中断处理程序过程的调用时,如果处理程序过程将在较低的数字权限级别上执行,则会发生堆栈交换。当发生堆栈切换时:

  1. 处理程序要使用的堆栈的段选择器和堆栈指针从当前执行的任务的TSS中获得。在这个新的堆栈上,处理器推送被中断过程的堆栈段选择器和堆栈指针

  2. 处理器然后保存EFLAGS, CS和EIP寄存器在新堆栈上的当前状态

  3. 如果异常导致错误码被保存,则将错误码压入EIP值之后的新堆栈。

如果处理程序过程将以与被中断过程相同的特权级别执行:

  1. 处理器将EFLAGS、CS和EIP寄存器的当前状态保存在当前堆栈上。

  2. 如果由于异常导致错误码被保存,则该错误码被压入当前堆栈的EIP值之后。

5.6 中断处理过程后,如何返回,处理器做了哪些操作

要从异常处理程序或中断处理程序返回,处理程序必须使用IRET(或IRETD)指令。

IRET指令与RET指令类似,除了它将保存的标志恢复到EFLAGS寄存器中。只有当CPL为0时,EFLAGS寄存器的IOPL字段才会恢复。只有当CPL小于或等于IOPL时,IF标志才会被改变。

p9itcVA.md.png

5.7 异常和中断处理过程的保护

异常处理程序和中断处理程序的特权级保护类似于通过调用门调用的普通过程调用。处理器不允许在特权比CPL低的代码段中将执行转移到异常处理程序或中断处理程序。

5.8 异常和中断处理过程的标志使用方式

当通过中断门或陷阱门访问异常或中断处理程序时,处理器在将EFLAGS寄存器的内容保存在堆栈上之后清除EFLAGS寄存器中的TF标志。(在调用异常和中断处理程序时,处理器还清除EFLAGS寄存器中的VM、RF和NT标志,然后将它们保存在堆栈上。)清除TF标志可以防止指令跟踪影响中断响应。随后的IRET指令将TF(以及VM、RF和NT)标志恢复为堆栈上EFLAGS寄存器保存的内容中的值

5.9 中断门与陷阱门的唯一区别是什么

中断门和陷阱门之间的唯一区别是处理器在EFLAGS寄存器中处理IF标志的方式不同。当通过中断门访问异常或中断处理过程时,处理器清除IF标志以防止其他中断干扰当前中断处理程序。随后的IRET指令将IF标志恢复为堆栈上EFLAGS寄存器中保存的内容中的值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值