Trapframe-中断帧
定义
struct trapframe (定义在 kernel/proc.h) 是每个进程独有的一页内存。它像一个“储物柜”。
为什么需要它?
当 Trap 发生进入内核瞬间:
- 没有寄存器可用: 32 个通用寄存器全是用户的数据。
- 没有栈可用:
sp指向的是用户栈,内核不能在上面 push 数据(不安全且不可靠)。 因此,必须有一块内存区域,通过非寄存器的方式(利用sscratch交换出的地址)来找到,用于转储用户寄存器。
存储内容
- 用户寄存器快照:
ra,sp,gp,tp,a0-a7… 全部保存。 - 内核上下文参数:
kernel_satp: 内核页表地址。kernel_sp: 该进程的内核栈顶地址。kernel_trap:usertrap()函数的地址。- 这些是在返回用户态之前 (
usertrapret) 预填好的,供下一次 Trap 进来时使用。