Trapframe-中断帧

定义

struct trapframe (定义在 kernel/proc.h) 是每个进程独有的一页内存。它像一个“储物柜”。

为什么需要它?

当 Trap 发生进入内核瞬间:

  1. 没有寄存器可用: 32 个通用寄存器全是用户的数据。
  2. 没有栈可用: sp 指向的是用户栈,内核不能在上面 push 数据(不安全且不可靠)。 因此,必须有一块内存区域,通过非寄存器的方式(利用 sscratch 交换出的地址)来找到,用于转储用户寄存器。

存储内容

  1. 用户寄存器快照: ra, sp, gp, tp, a0-a7… 全部保存。
  2. 内核上下文参数:
    • kernel_satp: 内核页表地址。
    • kernel_sp: 该进程的内核栈顶地址。
    • kernel_trap: usertrap() 函数的地址。
    • 这些是在返回用户态之前 (usertrapret) 预填好的,供下一次 Trap 进来时使用。