首页 文章

ARM中断和上下文保存

提问于
浏览
0

我试图了解中断如何在ARM体系结构中工作(特定于ARM7TDMI) . 我知道有七个例外(复位,数据中止,FIQ,IRQ,预取中止,SWI和未定义指令),它们以特定模式执行(分别为Supervisor,Abort,FIQ,IRQ,Abort,Supervisor和Undefined) . 我有以下问题 .

1.当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,是否还禁用了其他5个例外?

2.如果在启用I和F位时未禁用SWI,那么是否可以故意在外部中断的ISR内触发SWI异常?

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

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

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

谢谢 .

1 回答

  • 1

    当CPSR(状态寄存器)中的I和F位设置为1以禁用外部和快速中断时,是否还禁用了其他5个例外?

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

    如果在启用I和F位时未禁用SWI,那么是否可以故意在外部中断的ISR内触发SWI异常?

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

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

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

    每当执行模式改变时,处理器内部都会发生上下文保存(即使我们手动更改模式)?

    不,矢量页面中的指令/代码负责保存上下文 . 如果您有一个可预先占用的操作系统,那么您需要保存该进程的上下文并稍后恢复 . 您可能有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
    

    如何屏蔽/禁用SWI异常?

    你不能做这个 . 您可以编写一个 swi 处理程序,除了递增PC之外什么也不做,和/或您可以根据它的作用跳转到未定义的处理程序 .

相关问题