中断和异常是强制性的执行流的转移,从当前正在执行的任务或程序转移到一个特殊的称作句柄的例程或任务。当硬件发出信号时,便产生中断,中断的产生是同现在正在执行的任务是异步的,即中断的产生是随机的。异常是处理器在执行指令的过程中发现错误而产生的。
中断源:硬件中断、软件中断
异常:错误、陷阱、终止
中断描述符表(IDT)
处理器会为每个中断和异常分配一个识别码,称作向量。中断描述符表(IDT)为每一个异常或中断向量对应的例程或任务分配了一个门描述符。IDT由这些8字节的门描述符组成。异常或中断向量号乘以8即可得到IDT中的描述符的索引。
IDT包含三种门描述符:任务门描述符、中断门描述符、陷阱门描述符
中断门:
段选择符是一个16位的值,包含了一个13为的索引和请求特权级,目的是查找对应的段描述符。段描述符包含了中断程序的线性地址和访问权限等信息。
过程入口点偏移值是一个32位的值,它表示中断处理程序的入口点在段描述符定义的段内的偏移量
段描述符中的线性地址与过程入口偏移值相加,得到中断处理程序的入口点。
响应异常和中断时,处理器会将异常或中断向量作为IDT中描述符的索引。如果该索引指向一个中断门或陷阱们,那么处理器引用异常或中断例程;若指向的是任务门,处理器会执行任务切换,切换到异常或中断处理例程。
将中断向量乘以8(门描述符的字节数),结合IDTR寄存器存储着的IDT基址,就能找到相应中断门描述符。中断门描述符中的段选择符包含了中断程序段的段描述符,由段描述符可以找到中断程序段的基址,过程入口点偏移值包含中断处理程序的段内偏移值,两者结合得到中断处理程序入口点。
当处理器转去 执行一个异常或中断处理例程时,会将EFLAGS寄存器,CS寄存器,EIP寄存器的当前值保存到栈。(CS和EIP寄存器为中断提供一个返回地址指针(原始指令地址))
当中断或异常处理例程通过IDT中的任务门被访问时,会发生任务切换。用另一个任务来处理异常或中断。
好处:被中断进程的上下文被自动保存,通过任务门访问处理任务且使用新的0特权级堆栈可以防止系统崩溃。将处理任务和其他任务隔离开来。
坏处:任务切换要保存大量机器状态,比使用中断门要慢。