fix(kernel): [STK] 用户态 rbp 跳过链回溯(防嵌套 #PF 死循环)

用户进程异常时 rbp=0x7fffff...(用户栈),链回溯读 [rbp+8] 触发嵌套 #PF 无限循环(rsp 递减耗尽)。fr0>=0x80000000 时跳过链回溯。
This commit is contained in:
TermiNexus committed 2026-08-29 18:14:48 +08:00
1 parent 3a3d026f95
commit efa99a8c4b
1 file changed
+12 -4
+12 -4
View File
@@ -153,8 +153,12 @@ def isrCommonhandler(interrupt: t.CInt):
mov {c.AsmOut(fr4, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_RAX])
stk_buf: t.CArray[t.CChar, 160]
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
fr0, fr1, fr2, fr3, fr4)
if fr0 >= 0x80000000:
# 用户态 rbp(如 0x7fffff...):回溯会读用户栈地址 → 嵌套 #PF 死循环
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] user rbp=0x%lx, chain skipped\n", fr0)
else:
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
fr0, fr1, fr2, fr3, fr4)
serial.puts(stk_buf)
elif interrupt == 13:
gp_rip: t.CUInt64T = 0
@@ -213,8 +217,12 @@ def isrCommonhandler(interrupt: t.CInt):
mov {c.AsmOut(fr4, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_RAX])
stk_buf: t.CArray[t.CChar, 160]
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
fr0, fr1, fr2, fr3, fr4)
if fr0 >= 0x80000000:
# 用户态 rbp(如 0x7fffff...):回溯会读用户栈地址 → 嵌套 #PF 死循环
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] user rbp=0x%lx, chain skipped\n", fr0)
else:
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
fr0, fr1, fr2, fr3, fr4)
serial.puts(stk_buf)
s: sched.Scheduler | t.CPtr = sched._sched_ptr
# 如果调度器未初始化,直接进入安全停机状态