操作系统学习(十五) 、异常与中断处理

一、中断调用过程

处理器对异常和中断的处理过程的调用 操作方法与使用CALL指令调用程序过程和任务的方法类似。当响应一个异常或中断时,处理器使用异常或中断的向量作为IDT表的索引。如果索引指向中断门或陷阱门,则处理器使用与CALL指令操作任务门类似的方法进行任务切换,执行异常或中断处理任务。

异常或中断门引用运行在当前任务上下文中的异常或中断处理过程。门中的段选择符指向GDT或当前LDT中的可执行代码段描述符。门描述符中的偏移字段指向异常或中断处理过程的开始处。

825979-20180805212347067-1254073682.png

中断调用过程

当处理器执行异常或中断处理过程调用时会进行一下操作;

  • 如果处理器过程在搞特权级上执行时就会发生堆栈切换操作。堆栈切换过程如下:
    • 处理器从当前执行任务的TSS段中得到中断或异常处理过程使用的堆栈的段选择符和栈指针。然后处理器会把被中断程序(或任务)的栈选择符和栈指针压入新栈中。
    • 接着处理器会吧EFLAFS、CS和EIP寄存器的当前值也压入新栈中。
    • 如果异常会产生一个错误号,那么该错误号也会被最后压入新栈中。
  • 如果处理过程将在被中断任务同一个特权级上运行,那么:
    • 处理器会把EFLAGS、CS和EIP寄存器的当前值保存在当前堆栈上。
    • 如果异常会产生一个错误号,那么该错误号也会被最后压入新栈中。

825979-20180805214028539-556326370.png

转移到中断处理过程时堆栈使用方法

为了从中断处理过程中返回,处理过程必须使用IRET指令。IRET指令与RET指令相似,但IRET指令还会把保存的寄存器内容恢复到EFLAFS中。不过只有当CPL是0时才会恢复EFLAFS中的IOPL字段,并且只有当CPL<=IOPL时,IF标志才会被改变。如果当调用中断处理过程时发生了堆栈切换,那么在返回时IRET指令会切换回原来的堆栈。

二、异常或中高端处理过程的保护

异常和中断处理过程的特权级保护机制与通过调用门调用普通过程类似。处理器不允许把控制转移到比CPL更低特权级代码段的中断处理过程中,否则将产生一个一般保护性异常。另外中断和异常的保护机制在一下方面与一般调用门过程不同:

  • 因为中断和异常向量没有RPL,因此在隐式调用异常和中断处理过程时不会检查RPl。
  • 只有当一个异常或中断时利用INT n、INT 3 或INTO指令产生时,处理器才会检查中断或陷阱门中的DPL。此时CPL必须小于等于们的DPL。这个限制可以防止运行在特权级3的应用程序使用软件中断访问重要的异常处理过程,例如页错误处理过程,假设这些处理过程已被存放在更高特权级的代码段中。对于硬件产生的中断和处理器检测到的异常,处理器会忽略中断门和陷阱门中的DPL。 因为异常和中断通常不会定期发生。这个技术可以用于只需已访问堆栈上的数据的处理过程。如果处理程序需要数据段中的数据,那么特权级 3 必须能够访问这个数据段,但这样就没保护可言了。
  • 处理过程可以放在具有特权级 0 的非一致代码段中。这种处理过程总是可以执行的,而不管被中断程序或任务的当前特权级CPl。

三、异常或中断处理过程标志的使用方式

当通过中断门或陷阱门访问一个异常或中断处理过程,处理器会在把EFLAGS寄存器内容保存到堆栈上之后清除EFLAGS中的TF标志。清除TF标志可以防止指令跟踪影响中断响应。而随后的IRET指令会用堆栈上的内容恢复EFLAGS的原TF标志。

中断门与陷阱门唯一的区别在于处理器操作EFLAGS寄存器TF标志的方法。当通过中断门访问一个异常或中断处理过程时,处理器会复位TF标志以防止其他中断干扰当前中断处理过程。随后IRET指令则会用保存在堆栈上的内容恢复EFLAGS寄存器的TF标志,而通过陷阱门访问处理过程并不会影响TF标志位。

四、执行中断处理过程的任务

当通过IDT表中任务门访问异常或中断处理过程时,就会导致任务切换。从而可以在一个专用任务中执行中断或异常处理过程。IDT表中的任务门引用GDT中的TSS描述符。切换处理过程任务的方法与普通任务切换一样。

猜你喜欢

转载自blog.csdn.net/KLKFL/article/details/81519428