【发布时间】:2014-09-25 03:41:07
【问题描述】:
我从下面的 SE 问题了解函数调用和中断 (ISR) 跳转之间的基本区别。
difference between function call & ISR
但是我仍然不清楚,在这两种情况下,哪些寄存器将被推入/弹出堆栈?在这两种情况下,上下文切换将如何发生?由于我们不知道什么时候会发生中断,所以在进入 ISR 之前我们需要保存什么(变量、PC、标志 (PSW)、寄存器、上下文)?
如何在多线程环境下恢复原始上下文而不会丢失任何数据。
【问题讨论】:
-
这是高度依赖于平台的。对于 x86,指令指针和标志寄存器将被自动保存,但 ISR 必须保存/恢复其他寄存器。 ARM 使用专门用于中断的寄存器组。
-
你的意思是每个中断都有单独的寄存器组吗?如果嵌套中断会发生什么?每次切换到新银行都会发生保存当前上下文?如果正常调用函数会发生什么?只保存指令指针和标志?
-
很多时候,当一个CPU被中断时,它会自动禁用中断以防止嵌套中断。 ARM 的寄存器组尤其如此。至于函数调用,通常只保存指令指针(可能还有一些其他寄存器;同样,这取决于 CPU),而不是标志。
-
在进入ISR时,我们需要禁用中断&返回时它会调用reti,所以它会再次启用中断。它是否正确?如果在服务低优先级中断时,如果高优先级中断来了,那么上下文切换或库切换会再次发生吗?我只是想确认一下我的理解。
标签: c linux multithreading interrupt-handling isr