【问题标题】:how do the registers get saved when a process gets interrupted?进程中断时如何保存寄存器?
【发布时间】:2011-09-14 00:30:45
【问题描述】:

这一直困扰着我一整天。当程序设置自己在接收到某个中断时调用函数时,我知道在程序中断时将寄存器压入堆栈,但我想不通的是:寄存器如何脱离堆?我知道编译器不知道函数是否是中断处理程序,也不知道中断给函数提供了多少参数。那么它到底是如何关闭寄存器的呢?

【问题讨论】:

    标签: stack signals interrupt cpu-registers


    【解决方案1】:

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

    对于低级嵌入的东西,可以直接调用 ISR 以响应中断,编译器通常会对将给定例程标记为 ISR 的语言(通常是 C 或 C++)进行一些扩展,并且寄存器将在这样一个例程的开始和结束时被保存和恢复。 [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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2016-03-28
      • 2015-03-27
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多