- 什么是SVC异常?
- SVC是一种汇编指令;执行这样的汇编指令:SVC #VAL就会触发一次SVC异常
 
 - 在操作系统中,比如各类RTOS或者Linux,都会使用
SVC指令故意触发异常,从而导致内核的异常处理函数被调用,进而去使用内核的服务。(ARM9中是swi指令) - 比如Linux中,各类文件操作的函数
open、read、write,它的实质都是SVC指令。 在汇编代码中插入SVC指令:
SVC #1
SVC异常
.text.global _start_start:b resetldr pc, =do_undefinedldr pc, =do_svc // ldr pc, _software_interrupt.word 0 // ldr pc, _prefetch_abort.word 0 // ldr pc, _data_abort.word 0 // ldr pc, _not_used.word 0 // ldr pc, _irq.word 0 // ldr pc, _fiqreset:/* 设置sp *//* 对于STM32MP157设置链接地址为0xC0200000, 对于IMX6ULL设为0x80200000 */ldr sp, =STACK_BASEadr r0, _startbl SystemInitbl uart_init/* 设置异常向量表基地址 : VBAR */ldr r0, =_startmcr p15, 0, r0, c12, c0, 0.word 0xffffffffsvc #1/* 调用main函数 *///bl mainldr pc, =maindo_svc:/* 设置SP_und */ldr sp, =STACK_BASE - STACK_SIZE - STACK_SIZE/* 保存现场 */stmdb sp!, {R0-R3,R12,LR}/* 调用处理函数 */bl do_svc_c/* 恢复现场 */ldmia sp!, {R0-R3,R12,PC}^ //这里和未定义指令异常一样,也是不用对PC进行操作了,直接跳转到异常的下一条指令
