struct proc
struct proc (定义在 kernel/proc.h) 是 xv6 中最重要的结构体,它保存了一个进程的所有状态。
关键成员解析
p->state: 进程状态 (UNUSED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE)。p->pagetable: 用户页表。指向该进程私有的页表根节点。这就是“私有地址空间”的物理实现。p->trapframe: 中断帧。这是一块特殊的内存页。- 当发生 User → Kernel 切换时,用户寄存器(如
a0,sp,pc)会被保存到这里。 - 当内核返回用户态时,从这里恢复寄存器。
- 为什么不保存在栈上? 因为切换初期内核栈指针
sp还没准备好!
- 当发生 User → Kernel 切换时,用户寄存器(如
p->kstack: 内核栈。每个进程都有一个独立的内核栈。当进程在内核里跑(比如执行sys_read)时,用的是这个栈。
安全隐患
内核栈 (kstack) 通常大小固定(xv6 里是 4KB)。如果在内核里写了深度递归或者分配了大数组,会导致 Kernel Stack Overflow,直接覆盖相邻的数据结构,造成崩溃或利用。