RTL:trap.s的处理
在进行pa4:多道程序的处理时,其中一道题目除了要完成kcontext,还需要对应修改trap.s的__asm_trap函数。使得中断响应机制能正确切换不同进程的上下文,在kocontext已经修改好以后,要修改这里其实也很容易。
__am_asm_trap: addi sp, sp, -CONTEXT_SIZE MAP(REGS, PUSH) csrr t0, mcause csrr t1, mstatus csrr t2, mepc STORE t0, OFFSET_CAUSE(sp) STORE t1, OFFSET_STATUS(sp) STORE t2, OFFSET_EPC(sp) mv a0, sp #传入当前上下文 jal __am_irq_handle #中断处理函数会返回新上下文指针 LOAD t1, OFFSET_STATUS(sp) LOAD t2, OFFSET_EPC(sp) csrw mstatus, t1 csrw mepc, t2 MAP(REGS, POP) addi sp, sp, CONTEXT_SIZE mret
这个函数的入口会被存在mtvec这个csr寄存器里,在执行ecall指令时就会跳转执行。函数里,首先是处理了三个csr寄存器,然后传入当前上下文,并进入cte.c的am_irq_handle函数,这个函数又会调用cte_init里注册的回调函数,调用结束后,恢复现场,继续执行。但是要实现多道程序,就要做到多个程序的上下文切换,要处理其实也很简单。不管是riscv32还是32e,都可以通过a0寄存器传递参数。在kcontext里,我们设置a0储存参数。按照原本的asm_trap函数,我们将sp赋值给a0寄存器,然后进入服务和回调函数,但是离开后,却没有继续处理a0,想要实现多道程序,只需要增加一句mv sp,a0即可。