xv6 risc-v trap 笔记

本文详细介绍了xv6操作系统中RISC-V架构的中断处理机制,包括系统调用、异常和设备中断的处理流程。讨论了trap在内核态和用户态的不同情况,特别提到了定时中断的特殊处理方式。此外,还涵盖了系统调用参数传递、设备驱动和控制寄存器在中断处理中的作用,以console驱动为例展示了设备驱动的工作原理。
摘要由CSDN通过智能技术生成

xv6中trap(即让cpu暂停执行当前代码,去执行相应的处理代码的情况)有三种:

  • 系统调用
  • 异常,如除以零
  • 设备中断,例如完成了一次读写事件,当然也包括定时中断

发生trap时,一般的处理是:

  • 控制转移到kernel
  • kernel保存当前进程的相关状态(具体就是trampoline.s中,将寄存器保存到进程的trapframe,将栈顶指针设为内核栈的,恢复tp寄存器,让其保存当前cpu的id,从trapframe中取出内核页表页的地址,设置为satp的值,并刷新tlb,从tf中取出usertrap的地址,并跳转到它)
  • 执行trap handler代码(usetrap)
  • (可选的)执行usertrapret(TODO),
  • 执行trampoline.s中的userret
  • 返回用户态,继续执行用户程序

上面usertrap和usertrapret有一些细节需要注意,TODO

riscv trap machinery

riscv有一些控制寄存器,xv6里用到的有这些:这些寄存器只能在supervisor 模式(即内核态)被读写

  • stvec:保存trap handler的地址,当发生trap时,将他的值设为pc
  • sepc:当trap发生时,将pc保存到sepc,trap返回用户态时(trampoline.s中的useret),执行sret将sepc设置为pc
  • scause:发生trap时,这里保存的值指示trap的种类/原因
  • sscratch:发生trap时,他的值是当前进程tf的地址
  • sstatus:其中SPP bit标识之前的模式是supervisor(1)还是用户态(0),SIE bit标识当前中断是否开启,如果为0,那么中断会被推迟到SIE bit为1

当发生trap时,riscv的硬件会:

  • 如果是设备中断,并且SIE为0,那么什么也不做
  • 禁用中断(SIE置零
  • 将pc复制到sepc
  • 设置SPP bit,表明当前模式
  • 设置scause,表明trap原因
  • 将模式设为supervisor
  • 设置pc为sepc
  • 从新pc开始执行

cpu必须一次完成上述步骤,例如,如果没有更换pc,那么可能现在是内核态,但是仍然执行用户指令

注意,cpu并没有切换页表,没有切换栈,没

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值