3

我从下面的 SE 问题中了解函数调用和中断(ISR)跳转之间的基本区别。

函数调用和 ISR 的区别

但是我仍然不清楚,在这两种情况下,哪些寄存器将被推入/弹出堆栈?在这两种情况下,上下文切换将如何发生?由于我们不知道什么时候会发生中断,所以在进入 ISR 之前我们需要保存什么(变量、PC、标志 (PSW)、寄存器、上下文)?

我们如何在多线程环境下恢复原始上下文而不会丢失任何数据。

4

2 回答 2

2

我试图用谷歌搜索它并从中找到了所需的信息:

  1. 中断
  2. 上下文切换

谢谢@Drew McGowen

综上所述,中断的一般顺序如下:

Foreground code is running, interrupts are enabled
Interrupt event sends an interrupt request to the CPU
After completing the current instruction(s), the CPU begins the interrupt response
automatically saves current program counter
automatically saves some status (depending on CPU)
jump to correct interrupt service routine for this request
ISR code saves any registers and flags it will modify
ISR services the interrupt and re-arms it if necessary
ISR code restores any saved registers and flags
ISR executes a return-from-interrupt instruction or sequence
return-from-interrupt instruction restores automatically-saved status
return-from-interrupt instruction recovers saved program counter
Foreground code continues to run from the point it responded to the interrupt

像往常一样,这个过程的细节将取决于 CPU 设计。许多设备使用硬件堆栈来保存所有保存的数据,但 RISC 设计通常将 PC 保存在寄存器(链接寄存器)中。许多设计还具有可用于中断处理的单独的重复寄存器,从而减少了必须保存和恢复的状态数据量。

请注意,出于效率原因,保存和恢复前台代码状态通常是一个两步过程。硬件对中断的响应会自动保存最基本的状态,但 ISR 代码的第一行通常专门用于保存额外的状态(如果硬件不保存,通常以保存条件标志的形式,以及保存额外的寄存器)。使用这两个步骤的过程是因为每个 ISR 对其所需的寄存器数量有不同的要求,因此每个 ISR 可能需要保存不同的寄存器和不同数量的寄存器,以确保保存所有适当的状态数据而不会浪费时间不必要地保存寄存器(即保存未在 ISR 中修改的寄存器,因此不需要保存)。一个非常简单的 ISR 可能不需要使用任何寄存器,另一个 ISR 可能只需要使用一个或两个寄存器,而更复杂的 ISR 可能需要使用大量的寄存器。在任何情况下,ISR 都应该只保存和恢复它实际使用的那些寄存器。

于 2014-08-01T21:53:30.773 回答
1

我确定根据您使用的 CPU 有不同的实现。在一般级别上,函数调用将输入参数存储在 SPARC 上的给定寄存器 (%o0-%o9) 中,并且在被调用函数的 (%i0-%i9) 寄存器中可用。被调用函数然后将返回值放在 %i0 寄存器中,以便在调用函数的 %o0 寄存器中可用。根据Sparc Manual,每个中断是:

Accompanied by data, referred to as an “interrupt packet”. 
An interrupt packet is 64 bytes long, consisting of eight 64-bit doublewords.

根据这个来源,您当前执行线程中的数据是:

   Saved either on a stack (PDP-11, VAX, MIPS, x86_64) 
   or in a single set of dedicated registers (ARM, PowerPC)

上面的消息来源还提到了如何在几个不同的架构上处理中断。

请让我知道,如果你有任何问题!

于 2014-08-01T21:15:23.313 回答