当进程中断时如何保存寄存器?

时间:2011-06-13 15:28:01

标签: stack signals interrupt cpu-registers

这一直困扰着我。当一个程序在接收到某个中断时将自己设置为调用一个函数时,我知道当程序被中断时寄存器被压入堆栈,但我无法弄清楚的是:寄存器如何脱离堆?我知道编译器不知道函数是否是一个中断处理程序,并且它不知道中断给函数提供了多少个参数。那么它究竟是如何让寄存器关闭的?

1 个答案:

答案 0 :(得分:1)

这取决于编译器,操作系统和CPU。

对于低级嵌入式内容,可以直接调用ISR以响应中断,编译器通常会对语言(通常是C或C ++)进行一些扩展,将给定例程标记为ISR,并且寄存器将在这样的例程的开始和结束时保存和恢复。 [1]

对于常见的桌面/服务器操作系统,虽然中断和用户代码之间通常有一定程度的抽象 - 中断通常首先由一些内核代码处理,然后传递给用户例程,在这种情况下,内核代码负责保存并恢复寄存器,并且没有关于用户提供的ISR的特殊


[1]例如Keil 8051 C编译器:

void Some_ISR(void) interrupt 0 // this routine will get called in response to interrupt 0
{
    // compiler generates preamble to save registers

    // ISR code goes here

    // compiler generates code to restore registers and
    // do any other special end-of-ISR stuff
}