• 什么是SVC异常?
      • SVC是一种汇编指令;执行这样的汇编指令:SVC #VAL就会触发一次SVC异常
    • 在操作系统中,比如各类RTOS或者Linux,都会使用SVC指令故意触发异常,从而导致内核的异常处理函数被调用,进而去使用内核的服务。(ARM9中是swi指令)
    • 比如Linux中,各类文件操作的函数openreadwrite,它的实质都是SVC指令。
    • 在汇编代码中插入SVC指令:

      1. SVC #1
    • SVC异常

      1. .text
      2. .global _start
      3. _start:
      4. b reset
      5. ldr pc, =do_undefined
      6. ldr pc, =do_svc // ldr pc, _software_interrupt
      7. .word 0 // ldr pc, _prefetch_abort
      8. .word 0 // ldr pc, _data_abort
      9. .word 0 // ldr pc, _not_used
      10. .word 0 // ldr pc, _irq
      11. .word 0 // ldr pc, _fiq
      12. reset:
      13. /* 设置sp */
      14. /* 对于STM32MP157设置链接地址为0xC0200000, 对于IMX6ULL设为0x80200000 */
      15. ldr sp, =STACK_BASE
      16. adr r0, _start
      17. bl SystemInit
      18. bl uart_init
      19. /* 设置异常向量表基地址 : VBAR */
      20. ldr r0, =_start
      21. mcr p15, 0, r0, c12, c0, 0
      22. .word 0xffffffff
      23. svc #1
      24. /* 调用main函数 */
      25. //bl main
      26. ldr pc, =main
      27. do_svc:
      28. /* 设置SP_und */
      29. ldr sp, =STACK_BASE - STACK_SIZE - STACK_SIZE
      30. /* 保存现场 */
      31. stmdb sp!, {R0-R3,R12,LR}
      32. /* 调用处理函数 */
      33. bl do_svc_c
      34. /* 恢复现场 */
      35. ldmia sp!, {R0-R3,R12,PC}^ //这里和未定义指令异常一样,也是不用对PC进行操作了,直接跳转到异常的下一条指令