我正在 ARM v7 上编写一个小型操作系统。我在 qemu 上模拟了树莓派。我已经编写了一个带有处理程序的中断向量表,并且不确定处理程序是否应该在完成后跳回错误指令。它可能看起来令人畏惧,但理解起来并不多。我只是从链接寄存器中减去 4 或 8 个字节,并将其与 r0-r12 一起保存在堆栈上,以便我可以将指向寄存器的指针作为参数传递到 C 处理函数中。 现在,一旦我跳回来,我应该跳到中断原因还是之后的原因?谢谢!
undefined_instruction:
sub lr, #4
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl undefined_instruction_C
LDMIA sp!, {r0-r12,pc}^
software_interrupt:
sub lr, #4
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl software_interrupt_C
LDMIA sp!, {r0-r12,pc}^
not_used:
mov r0,r0
irq:
sub lr, #8
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl irq_C
LDMIA sp!, {r0-r12,pc}^
fiq:
sub lr, #4
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl fiq_C
LDMIA sp!, {r0-r12,pc}^
reset:
mov r0,r0
prefetch_abort:
sub lr, #4
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl prefetch_abort_C
LDMIA sp!, {r0-r12,pc}^
data_abort:
sub lr, #8
stmfd sp!, {r0-r12,lr}
mov r0, sp
bl data_abort_C
LDMIA sp!, {r0-r12,pc}^
.global _INIT_IVT
_INIT_IVT:
ldr r0, =_ivt
mcr p15, 0, r0, c12, c0, 0
bx lr
.global _ivt
.balign 64
_ivt:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
中断由外部事件触发。异常(故障和陷阱)由指令触发。如果您正在处理已纠正的错误,您可以重新启动导致错误的指令。
如果您正在处理中断,您可以返回到进程的指令流,或者可以调用调度程序并选择要执行的进程。