假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回)。有4条指令必须执行。
(这些样本说明不准确,但我相信这一点可以理解)
在第五个时钟周期中,这些指令将处于管道中,如下所示。
添加a,b,c [IF ID EX MEM WB]
添加a,b,d [IF ID EX MEM]
添加a,b,e [IF ID EX]
添加a,b,f [IF ID]
现在,如果发生硬件中断,这些指令会发生什么。只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?
答案 0 :(得分:1)
对于精确的中断,IF阶段之前的指令跳转到ISR正常退出。当ISR返回时,执行从原始进程的最后一条退出指令之后的下一条指令开始重新开始。换句话说,精确的中断总是发生在指令之间。
同步中断的处理有点不同。以x86为例,同步异常有三种形式,即陷阱,故障和中止。
陷阱(如INT3)会导致内核在堆栈上的陷阱之后推送指令,这样当ISR返回时,内核不会无意义地重新执行相同的陷阱指令。
故障,如页面错误,导致核心推送堆栈上的错误指令,这样当ISR返回时,核心将重新执行错误指令,可能现在在再次避免相同故障的情况下。 / p>
中止,就像双重故障一样,是一个致命的不可恢复的问题,处理器无法在停止的地方恢复执行。
在进入ISR之前由核心推送的中断堆栈帧的内容根据您所讨论的情况而有所不同。