From efa99a8c4b87229848bcc8ad9ea624f59f6e641e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 29 Aug 2026 18:14:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(kernel):=20[STK]=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=80=81=20rbp=20=E8=B7=B3=E8=BF=87=E9=93=BE=E5=9B=9E=E6=BA=AF?= =?UTF-8?q?=EF=BC=88=E9=98=B2=E5=B5=8C=E5=A5=97=20#PF=20=E6=AD=BB=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户进程异常时 rbp=0x7fffff...(用户栈),链回溯读 [rbp+8] 触发嵌套 #PF 无限循环(rsp 递减耗尽)。fr0>=0x80000000 时跳过链回溯。 --- VKernel/Kernel/intr/idt.vp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/VKernel/Kernel/intr/idt.vp b/VKernel/Kernel/intr/idt.vp index 2b319d2..5bbd473 100644 --- a/VKernel/Kernel/intr/idt.vp +++ b/VKernel/Kernel/intr/idt.vp @@ -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 # 如果调度器未初始化,直接进入安全停机状态