Trampoline-蹦床页面

核心悖论

当 CPU 执行 uservec 时,需要切换页表 (csrw satp, ...) 从用户空间切到内核空间。

  • 切换前: PC 指向 uservec 的虚拟地址。
  • 切换后: 如果内核页表里没有这个虚拟地址的映射,CPU 试图取下一条指令时就会触发 Page Fault(双重故障,直接死机)。

解决方案:Trampoline

xv6 将包含 uservecuserret 代码的物理内存页(trampoline.S),同时映射到:

  1. 用户页表 的最高虚拟地址 (MAXVA 处)。
  2. 内核页表 的最高虚拟地址 (MAXVA 处)。

效果

csrw satp 指令执行完毕,页表瞬间切换。 但由于两个页表在同一个虚拟地址(Trampoline Page)映射了同一段物理代码。 CPU 感觉不到地面的变化,PC 指针依然指向有效的指令,程序得以继续执行。这就是“蹦床”——在两个世界之间无缝弹跳。