• Cortex-A核的异常的处理过程


    1、Cortex-A核的处理器工作模式

    Monitor Mode : 安全监控模式,主要运行安全相关的代码。

    PHY_mode : 超级管理模式,主要是用于虚拟化技术的支持。

    2、ARM处理器的异常

    中断属于异常中的一种。导致处理器从用户模式切换到异常模式的事件通常异常源。

    异常模式异常源备注
    FIQ异常模式FIQ类型的异常源FIQ类型的异常源指的是一类,不是某一个。
    IRQ异常模式IRQ类型的异常源IRQ类型的异常源指的是一类,比如按键中断,定时器中断,串口中断,....
    SVC模式Reset信号系统发送复位时,复位按键,看门狗复位,上电复位。
    软中断指令(swi)swi 软中端号, 软中断号的范围为0 ~ (2^24-1)
    Abort模式data Abort类型异常源取数据发送异常,
    Prefetch Abort类型异常源取指令发送异常。
    Undef模式undef类型异常源译码器翻译指令时,无法解析指令,则是未定义的异常

    总结:5种异常模式对应着7中异常源,异常源具有优先级,复位的优先级是最高。

    3、异常的处理过程

    当发生异常时,程序切换到异常处理程序中执行,分析异常的处理过程。

     

    4、swi软中断指令

    start.s文件:

    1. @ 启动文件
    2. .text
    3. .global _start
    4. _start:
    5. @ 1. 构建异常向量表
    6. b reset
    7. b undef_handler
    8. b swi_handler
    9. b pref_handler
    10. b data_handler
    11. b .
    12. b irq_handler
    13. b fiq_handler
    14. @ 异常处理程序的入口函数
    15. reset:
    16. @ 2. 初始化SVC模式下的栈指针,
    17. ldr sp, =0x40000800
    18. @ 3. 从svc模式切换到user模式
    19. mrs r0, cpsr
    20. bic r0, r0, #0x1F
    21. orr r0, r0, #0x10
    22. msr cpsr, r0
    23. @ 4. 初始化user模式下的栈指针
    24. ldr sp, =0x40000700
    25. mov r0, #0x3
    26. mov r1, #0x4
    27. @ 软中断指令
    28. @ 执行软中断指令,CPU自动完成4大步3小步保存现场,
    29. /*
    30. 1. 保存cpsr到spsr_
    31. 2. 修改cpsr
    32. 2.1 切换到ARM状态
    33. 2.2 禁止中断位,根据需要
    34. 2.3 修改模式位,切换到对应的异常模式
    35. 3. 保存返回地址到LR_
    36. 4. 修改PC值执行异常向量表中
    37. */
    38. swi 2
    39. add r2, r0, r1 @ r2 = r0 + r1 = 0x7
    40. nop
    41. nop
    42. b stop
    43. undef_handler:
    44. @ 软中断的异常处理程序
    45. swi_handler:
    46. stmfd sp!, {r0-r1, lr} @ 压栈保存现场
    47. mov r0, #9
    48. mov r1, #15
    49. @ 将lr中的值恢复给PC
    50. @ ^ : 恢复spsr_到cpsr中
    51. ldmfd sp!, {r0-r1, pc}^ @ 出栈恢复现场
    52. pref_handler:
    53. data_handler:
    54. irq_handler:
    55. fiq_handler:
    56. stop:
    57. b stop
    58. .end
    1. @ 启动文件
    2. .text
    3. .global _start
    4. _start:
    5. @ 1. 构建异常向量表
    6. b reset
    7. ldr pc, __undef_handler
    8. ldr pc, __swi_handler
    9. ldr pc, __pref_handler
    10. ldr pc, __data_handler
    11. b .
    12. ldr pc, __irq_handler
    13. ldr pc, __fiq_handler
    14. @ .word : 申请4字节的空间存放一个32位的数据
    15. /* __undef_handler指针变量名,申请4字节空间,
    16. 存undef_handler函数的入口地址 */
    17. __undef_handler:
    18. .word undef_handler
    19. __swi_handler:
    20. .word swi_handler
    21. __pref_handler:
    22. .word pref_handler
    23. __data_handler:
    24. .word data_handler
    25. __irq_handler:
    26. .word irq_handler
    27. __fiq_handler:
    28. .word fiq_handler
    29. @ 异常处理程序的入口函数
    30. reset:
    31. @ 2. 初始化SVC模式下的栈指针,
    32. ldr sp, =0x40000800
    33. @ 3. 从svc模式切换到user模式
    34. mrs r0, cpsr
    35. bic r0, r0, #0x1F
    36. orr r0, r0, #0x10
    37. msr cpsr, r0
    38. @ 4. 初始化user模式下的栈指针
    39. ldr sp, =0x40000700
    40. mov r0, #0x3
    41. mov r1, #0x4
    42. @ 软中断指令
    43. @ 执行软中断指令,CPU自动完成4大步3小步保存现场,
    44. /*
    45. 1. 保存cpsr到spsr_
    46. 2. 修改cpsr
    47. 2.1 切换到ARM状态
    48. 2.2 禁止中断位,根据需要
    49. 2.3 修改模式位,切换到对应的异常模式
    50. 3. 保存返回地址到LR_
    51. 4. 修改PC值执行异常向量表中
    52. */
    53. swi 2
    54. add r2, r0, r1 @ r2 = r0 + r1 = 0x7
    55. nop
    56. nop
    57. b stop
    58. undef_handler:
    59. @ 软中断的异常处理程序
    60. swi_handler:
    61. stmfd sp!, {r0-r1, lr} @ 压栈保存现场
    62. mov r0, #9
    63. mov r1, #15
    64. @ 将lr中的值恢复给PC
    65. @ ^ : 恢复spsr_到cpsr中
    66. ldmfd sp!, {r0-r1, pc}^ @ 出栈恢复现场
    67. pref_handler:
    68. data_handler:
    69. irq_handler:
    70. fiq_handler:
    71. stop:
    72. b stop
    73. .end

    1. @ 启动文件
    2. .text
    3. .global _start
    4. _start:
    5. @ 1. 构建异常向量表
    6. b reset
    7. ldr pc, __undef_handler
    8. ldr pc, __swi_handler
    9. ldr pc, __pref_handler
    10. ldr pc, __data_handler
    11. b .
    12. ldr pc, __irq_handler
    13. ldr pc, __fiq_handler
    14. @ .word : 申请4字节的空间存放一个32位的数据
    15. /* __undef_handler指针变量名,申请4字节空间,
    16. 存undef_handler函数的入口地址 */
    17. __undef_handler:
    18. .word undef_handler
    19. __swi_handler:
    20. .word swi_handler
    21. __pref_handler:
    22. .word pref_handler
    23. __data_handler:
    24. .word data_handler
    25. __irq_handler:
    26. .word irq_handler
    27. __fiq_handler:
    28. .word fiq_handler
    29. @ 异常处理程序的入口函数
    30. reset:
    31. @ 2. 初始化SVC模式下的栈指针,
    32. ldr sp, =0x40000800
    33. @ 3. 从svc模式切换到user模式
    34. mrs r0, cpsr
    35. bic r0, r0, #0x1F
    36. orr r0, r0, #0x10
    37. msr cpsr, r0
    38. @ 4. 初始化user模式下的栈指针
    39. ldr sp, =0x40000700
    40. mov r0, #0x3
    41. mov r1, #0x4
    42. @ 软中断指令
    43. @ 执行软中断指令,CPU自动完成4大步3小步保存现场,
    44. /*
    45. 1. 保存cpsr到spsr_
    46. 2. 修改cpsr
    47. 2.1 切换到ARM状态
    48. 2.2 禁止中断位,根据需要
    49. 2.3 修改模式位,切换到对应的异常模式
    50. 3. 保存返回地址到LR_
    51. 4. 修改PC值执行异常向量表中
    52. */
    53. swi 2
    54. swi 3
    55. swi 4
    56. add r2, r0, r1 @ r2 = r0 + r1 = 0x7
    57. nop
    58. nop
    59. b stop
    60. undef_handler:
    61. @ 软中断的异常处理程序
    62. swi_handler:
    63. stmfd sp!, {r0-r1, lr} @ 压栈保存现场
    64. @ 获取软中断号
    65. sub r3, lr, #4
    66. ldr r4, [r3]
    67. bic r4, r4, #0xFF000000
    68. cmp r4, #2
    69. moveq r0, #9
    70. cmp r4, #3
    71. moveq r1, #15
    72. cmp r4, #4
    73. moveq r0, #6
    74. moveq r1, #12
    75. @ 将lr中的值恢复给PC
    76. @ ^ : 恢复spsr_到cpsr中
    77. ldmfd sp!, {r0-r1, pc}^ @ 出栈恢复现场
    78. pref_handler:
    79. data_handler:
    80. irq_handler:
    81. fiq_handler:
    82. stop:
    83. b stop
    84. .end
  • 相关阅读:
    Vue六(插件|Vuex的使用|购物车垮组件通信|Vue-route|路由跳转 携带数据 嵌套 守卫)
    axios的delete操作你踩过坑吗?
    Linux内存泄露案例分析和内存管理分享
    线性DP例题
    基于Matlab实现图像目标边界描述
    计网:第二章 物理层
    【JAVA程序设计】(C00083)基于SSM+uniapp好物分享小程序及管理系统-有文档
    延迟队列实现订单超时自动取消
    Qt查询mysql表的信息解释
    【Python测试开发】:切换窗口和表单
  • 原文地址:https://blog.csdn.net/a2998658795/article/details/126681039