【问题标题】:ARM interrupts and context savingARM 中断和上下文保存
【发布时间】:2015-12-28 04:46:24
【问题描述】:

我正在尝试了解中断在 ARM 架构中是如何工作的(具体来说是 ARM7TDMI)。我知道有七个异常(复位、数据中止、FIQ、IRQ、预取中止、SWI 和未定义指令),它们以特定模式执行(分别为主管、中止、FIQ、IRQ、中止、主管和未定义)。我有以下问题。

1.当CPSR(status register)中的I和F位设置为1来禁止外部快速中断时,其他5个异常是否也被禁止了?

2. 如果在I和F位使能时SWI没有被禁止,那么是否可以在外部中断的ISR中故意触发SWI异常?

3.当任何中断被触发保存CPSR到SPSR时,改变模式由处理器自己完成。那么,编写 ISR 处理程序函数并使用处理程序地址更新向量表是否足够(我不想将 r0 保存到 r12 通用寄存器)?

4. 每当执行模式更改时,处理器内部是否会进行上下文保存(即使我们手动更改模式)?

5. 如何屏蔽/禁用 SWI 异常?


谢谢。

【问题讨论】:

  • 如果中止或 SWI 可以被禁用,您认为事情会如何运作?用户空间代码将如何对其系统调用被忽略作出反应?如果执行没有被转移到故障处理程序,那么当它需要的数据/指令不存在时,CPU 将如何继续执行?
  • 嗨 Notlikethat,我不知道 ARM 是如何做这些事情的。请把我当作初学者,我并不是说要永久禁用它们。想知道它们是否可以被禁用,如果可以,那么怎么做。
  • 啊,我的评论并不是为了批评,而是作为一个矛盾的思想实验。忽略任何特定于 ARM 的细节,考虑中断(您知道可以被屏蔽)是 异步,而您询问的其他事情是通过执行特定指令触发的。屏蔽中断可以防止它现在发生,但无论如何它可能只是在以后发生;现在想象屏蔽一个 同步 事件,如果中间的代码取决于该事件的发生,你将如何进行到稍后可以取消屏蔽它的点? ;)
  • 是的,我现在明白了。谢谢。

标签: exception arm interrupt


【解决方案1】:
  1. 当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,其他5个异常是否是 也被禁用了?

不,这些都取决于您的代码是否正确。例如,编译器通常不会生成swi 指令。

  1. 如果在启用 I 和 F 位时未禁用 SWI,是否可以在 外部中断?

是的,这是可能的。您可以在 swi 处理程序中检查 SPSR 的模式,并根据需要中止(或任何适当的)。

3.当任何中断被触发保存CPSR到SPSR时,改变模式由处理器自己完成。那么,写就够了吗 ISR 处理程序函数并使用处理程序更新向量表 地址(我不想将 r0 保存到 r12 通用寄存器)?

没有人想保存寄存器。但是,如果您使用 r0 到 r12,则主代码将损坏。已存储的sp 用于存储这些寄存器。此外,向量表不是处理程序地址,而是指令/代码。

  1. 无论何时更改执行模式,处理器内部都会进行上下文保存(即使我们更改了模式 手动)?

不,向量页面中的指令/代码负责保存上下文。如果您有一个可抢占的操作系统,那么您需要保存进程的上下文并稍后恢复。您可能有 1000 多个进程。因此 CPU 无法自动执行此操作。您的上下文保存区域可能植根于super mode 堆栈;在这种情况下,您可以使用 ISR/FIQ sp 作为临时寄存器。例如,ARM Linux 中的switch_to 函数可能会有所帮助。 thread_info 植根于主管堆栈,用于用户空间进程/线程的内核管理。最少的代码(删除了功能)是,

__switch_to:
    add ip, r1, #TI_CPU_SAVE                @ Get save area to `ip`.
    stmia   ip!, {r4 - sl, fp, sp, lr} )    @ Store most regs on stack
    add r4, r2, #TI_CPU_SAVE                @ Get restore area to `r4`
    ldmia   r4, {r4 - sl, fp, sp, pc}  )    @ Load all regs saved previously
    @ note the last instruction returns to a previous 
    @ switch_to call by the destination thread/process
  1. 如何屏蔽/禁用 SWI 异常?

你不能这样做。您可以编写一个 swi 处理程序,该处理程序只增加 PC 和/或您可以根据它的作用跳转到 undefined 处理程序。

【讨论】:

  • 没有什么是 CPU 自动完成的,因为不同的操作系统架构可能有不同的设计目标。大量进程、不同的内存空间、低延迟等。
  • 感谢您回答我的问题。您能否再澄清几点,在触发中断时,CPSR 被保存到存储的 SPSR 中,并且处理器在进入处理程序之前将模式更改为所需模式。对吗?
  • 如果在启用中断之前进入中断处理程序后出现嵌套中断,建议将模式更改为系统模式,然后启用中断位(据说更改模式可以防止损坏lr 如果外部中断嵌套多次)。我认为更改模式将保存上下文,否则 lr 在嵌套外部中断后如何保持安全。如果模式更改不保存上下文,那么嵌套中断如何工作?
  • 您的第一条评论/问题是正确的。同样,CPU 不保存寄存器。只有一个 IRQ-lr,所以如果重新启用中断,则必须在重新启用 IRQ 之前保存中断的 LR。您的上下文保存将取决于您使用的操作系统模型(或带有中断的单任务裸机)。
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2017-12-18
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多