CPU外:外部设备的中断由中断代理芯片接收,处理后将该中断向量号发送到CPU
CPU内:CPU执行该中断对应的中断处理程序
软中断:
当发生中断的时候,当前的CPL必须在门描述符DPL和门中目标代码段DPL之间
外部中断和异常:
当中断发生的时候,只检查CPL和目标段的DPL
而执行中断处理程序就是将目标段选择子加载到CS段寄存器中,再将偏移地址加载到EIP中。
中断门会将IF置0,避免中断嵌套;陷阱门(为了方便调试)和任务门(为了支持多任务)不会置0。
当中断处理程序执行完毕后会使用iret指令从中断返回,从栈中弹出数据到cs、eip、eflags等,再根据特权级是否改变,判断是否需要恢复相应的特权级栈。
cli和sti可以对IF位进行置位,但是IF位只能限制外部设备中断。
其实我认为广义的中断实际上有2种情况:
1.需要调用中断处理程序的中断
2.执行任务切换其实也可以视作是产生一次中断
那么如果判断是从中断中返回,还是返回到调用自己执行的那个旧任务呢?其实发生中断的时候,eflags会将TF和NT(任务嵌套标志位)位置0,如果是执行任务切换,会将旧任务的TSS选择子写到新任务的TSS中“上一个旧任务TSS的指针”字段中,并且将新任务的eflags的NT位置1。
那么当新任务返回的时候,会根据NT位是否为1来判断是回到旧任务还是从中断返回。