- 什么是SVC异常?
- SVC是一种汇编指令;执行这样的汇编指令:SVC #VAL就会触发一次SVC异常
- 在操作系统中,比如各类RTOS或者Linux,都会使用
SVC
指令故意触发异常,从而导致内核的异常处理函数被调用,进而去使用内核的服务。(ARM9中是swi指令) - 比如Linux中,各类文件操作的函数
open
、read
、write
,它的实质都是SVC
指令。 在汇编代码中插入SVC指令:
SVC #1
SVC异常
.text
.global _start
_start:
b reset
ldr pc, =do_undefined
ldr 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, _fiq
reset:
/* 设置sp */
/* 对于STM32MP157设置链接地址为0xC0200000, 对于IMX6ULL设为0x80200000 */
ldr sp, =STACK_BASE
adr r0, _start
bl SystemInit
bl uart_init
/* 设置异常向量表基地址 : VBAR */
ldr r0, =_start
mcr p15, 0, r0, c12, c0, 0
.word 0xffffffff
svc #1
/* 调用main函数 */
//bl main
ldr pc, =main
do_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进行操作了,直接跳转到异常的下一条指令