当x86处理器在特权级别3中执行一系列指令时,如何在中间插入不在指令序列中的特权级别0中断?
处理非编程中断的步骤是什么?例如,用户程序中除以0将导致除法错误;执行分裂后会发生什么?如何调用中断?特权级别是否仍然被检查?
我尝试使用gdb来解决这个问题。
除以0指令后,
cs:eip
根据IDT[0]
进行了更改。 cs
有权限0。ss:esp
根据当前的TSS进行了更改。cs:eip
和ss:esp
都保存在TSS指定的堆栈中。但是,在故意调用int 0
之后,会生成一般性保护错误。同样,根据cs:eip
和当前TSS更改ss:esp
和IDT[13]
,并保存用户。
因此,为什么在用户程序中除以0指令(例如C中的1 / 0
)能够通过IDT[0]
引起中断,但故意调用int 0
用户程序将通过IDT[13]
导致中断。