当前位置:   article > 正文

ARM处理器的异常模式_arm处理器异常工作模式

arm处理器异常工作模式

1、ARM处理器有各种异常模式,用于应对ARM出现的不同状态。出现异常时,会随即进入相关的异常向量,同时CPSR的寄存器也会设置成具体的模式。

例:当出现中断时,不管是哪种中断,都会跳转到0x18这个总入口地址(也有可能是0xFFFFFF18,看系统初始化的虚拟地址,无所谓),然后通过中断号执行具体的中断注册函数。

同时会把CPSR寄存器设置成相应的模式。

当从一个模式切换到另一个模式的时候,需要把之前模式下的HW context保存起来,比方说从用户态进入内核态,因为新模式下,内存区域划分是不一样的。如下图,各个模式下的通用寄存器是同一份,在两种模式下,可以用来传递信息,但是像sp,lr跟空间相关的寄存器会独立一份。

2、出现异常时,如何进入异常模式

2.1、在内核启动阶段,会对异常向量表完成初始化。

  1. start_kernel
  2. setup_arch
  3. early_trap_init
  1. void __init early_trap_init(void *vectors_base)
  2. {
  3. unsigned long vectors = (unsigned long)vectors_base;
  4. extern char __stubs_start[], __stubs_end[];
  5. extern char __vectors_start[], __vectors_end[];
  6. unsigned i;
  7. vectors_page = vectors_base;
  8. ......
  9. /*
  10. * Copy the vectors, stubs and kuser helpers (in entry-armv.S)
  11. * into the vector page, mapped at 0xffff0000, and ensure these
  12. * are visible to the instruction stream.
  13. */
  14. memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);
  15. memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start);
  16. ......
  17. }

异常向量地址保存在vectors_base变量(CONFIG_VECTORS_BASE=0xffff0000)中。

异常向量地址__vectors_start在entry-armv.S - arch/arm/kernel/entry-armv.S - Linux source code (v5.16.9) - Bootlin实现初始化。

在编译的时候,地址已经确定

grep "__vectors" System.map -nR

启动的时候,可以看到异常向量的地址分布情况。

2.2、出现异常时,跳转到异常向量入口__vectors_start,不同的异常对应着不同的偏移量,从图1可以看出software interrrupt对应着异常向量第三项,即W(ldr)    pc, .L__vectors_start + 0x1000对应着software interrupt的入口。

  1. .L__vectors_start:
  2. W(b) vector_rst
  3. W(b) vector_und
  4. W(ldr) pc, .L__vectors_start + 0x1000
  5. W(b) vector_pabt
  6. W(b) vector_dabt
  7. W(b) vector_addrexcptn
  8. W(b) vector_irq
  9. W(b) vector_fiq
  10. .data
  11. .align 2
  12. .globl cr_alignment

 后续会根据宏定义跳转到具体的异常向量处理流程。

  1. .macro vector_stub, name, mode, correction=0
  2. .align 5
  3. vector_\name:
  4. .if \correction
  5. sub lr, lr, #\correction
  6. .endif
  7. @
  8. @ Save r0, lr_<exception> (parent PC) and spsr_<exception>
  9. @ (parent CPSR)
  10. @
  11. stmia sp, {r0, lr} @ save r0, lr
  12. mrs lr, spsr
  13. str lr, [sp, #8] @ save spsr
  14. @
  15. @ Prepare for SVC32 mode. IRQs remain disabled.
  16. @
  17. mrs r0, cpsr
  18. eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)
  19. msr spsr_cxsf, r0
  20. @
  21. @ the branch table must immediately follow this code
  22. @
  23. and lr, lr, #0x0f
  24. THUMB( adr r0, 1f )
  25. THUMB( ldr lr, [r0, lr, lsl #2] )
  26. mov r0, sp
  27. ARM( ldr lr, [pc, lr, lsl #2] )
  28. movs pc, lr @ branch to handler in SVC mode
  29. ENDPROC(vector_\name)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/973499
推荐阅读
相关标签
  

闽ICP备14008679号