struct proc

struct proc (定义在 kernel/proc.h) 是 xv6 中最重要的结构体,它保存了一个进程的所有状态。

关键成员解析

  1. p->state: 进程状态 (UNUSED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE)。
  2. p->pagetable: 用户页表。指向该进程私有的页表根节点。这就是“私有地址空间”的物理实现。
  3. p->trapframe: 中断帧。这是一块特殊的内存页。
    • 当发生 User Kernel 切换时,用户寄存器(如 a0, sp, pc)会被保存到这里。
    • 当内核返回用户态时,从这里恢复寄存器。
    • 为什么不保存在栈上? 因为切换初期内核栈指针 sp 还没准备好!
  4. p->kstack: 内核栈。每个进程都有一个独立的内核栈。当进程在内核里跑(比如执行 sys_read)时,用的是这个栈。

安全隐患

内核栈 (kstack) 通常大小固定(xv6 里是 4KB)。如果在内核里写了深度递归或者分配了大数组,会导致 Kernel Stack Overflow,直接覆盖相邻的数据结构,造成崩溃或利用。