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即可。

posted @ 2024-12-17 17:19  namezhyp  阅读(2)  评论(0编辑  收藏  举报