软中断处理程序A执行到一半的时候被硬件中断打断,如何回到A被打断的地方继续执行?
软中断处理程序A执行到一半的时候被硬件中断打断,如何回到A被打断的地方继续执行?假如进程被打断,回到之前被打断的地方继续执行是可以理解的,因为有进程上下文。
但是软中断上下文是不保存cpu寄存器等信息的噢!那怎么回到当初被打断的代码处呢? 会保存吧
当硬件中断发生时,cpu 读取vector,从idt表中找到地址,这里一般是在entry.s那里的汇编,我记得这部分汇编会save寄存器,然后去do_IRQ,最后会返回到原来的地方。 [ 本帖最后由 karma303 于 2016-08-20 10:37 编辑 ]
这不算是个什么问题。
发生在内核态的硬中断不会导致堆栈切换,而且中断门入口处,内核照样会把cpu 寄存器压栈保存。
你看一看杨季文《80x86》第339和440页。 怎么能不保存呢,软中断或硬中断是可以被更高优先级的硬中断嵌套执行的,寄存器形成栈帧入栈,arm64参考代码如下:
el1_irq:
kernel_entry 1 // 保存寄存器信息,cpu进入el1模式
... ...
irq_handler // 执行中断处理函数
.macrokernel_entry, el, regsize = 64
sub sp, sp, #S_FRAME_SIZE - S_LR // room for LR, SP, SPSR, ELR
push x28, x29
push x26, x27
... ...
push x2, x3
push x0, x1
页:
[1]