Trampoline-蹦床页面
核心悖论
当 CPU 执行 uservec 时,需要切换页表 (csrw satp, ...) 从用户空间切到内核空间。
- 切换前: PC 指向
uservec的虚拟地址。 - 切换后: 如果内核页表里没有这个虚拟地址的映射,CPU 试图取下一条指令时就会触发 Page Fault(双重故障,直接死机)。
解决方案:Trampoline
xv6 将包含 uservec 和 userret 代码的物理内存页(trampoline.S),同时映射到:
- 用户页表 的最高虚拟地址 (
MAXVA处)。 - 内核页表 的最高虚拟地址 (
MAXVA处)。
效果
当 csrw satp 指令执行完毕,页表瞬间切换。
但由于两个页表在同一个虚拟地址(Trampoline Page)映射了同一段物理代码。
CPU 感觉不到地面的变化,PC 指针依然指向有效的指令,程序得以继续执行。这就是“蹦床”——在两个世界之间无缝弹跳。