From a85f826adf1a4a80817e575ec158bf67d9dec3ab Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 29 Aug 2026 17:50:32 +0800 Subject: [PATCH] =?UTF-8?q?debug(kernel):=20#PF=20=E6=89=93=E5=8D=B0=20rbp?= =?UTF-8?q?=20=E9=93=BE=E5=9B=9E=E6=BA=AF=EF=BC=88=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E5=B8=A7=20+=204=20=E7=BA=A7=E8=BF=94=E5=9B=9E=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit devfs_directory.find 崩溃(cr2=0x0 写 NULL,rax=rsp=0x6f0 异常)说明调用链栈已被破坏。isr.s 新增 _fault_rbp 保存异常现场 rbp,idt.vp [PF] 分支打印 [STK] 链定位栈损坏源。 --- VKernel/Kernel/intr/idt.vp | 25 +++++++++++++++++++++++++ VKernel/Kernel/intr/isr.s | 3 +++ 2 files changed, 28 insertions(+) diff --git a/VKernel/Kernel/intr/idt.vp b/VKernel/Kernel/intr/idt.vp index eb001eb..d00ed2d 100644 --- a/VKernel/Kernel/intr/idt.vp +++ b/VKernel/Kernel/intr/idt.vp @@ -124,6 +124,31 @@ def isrCommonhandler(interrupt: t.CInt): buf: t.CArray[t.CChar, 100] viperlib.snprintf(c.Addr(buf), 100, "[PF] cr2=0x%lx rip=0x%lx err=0x%lx rsp=0x%lx\n", cr2, fault_rip, fault_err, fault_rsp) serial.puts(buf) + # [STK] rbp 链回溯(定位栈损坏源:崩溃帧 + 4 级调用链的返回地址) + fr0: t.CUInt64T = 0 + fr1: t.CUInt64T = 0 + fr2: t.CUInt64T = 0 + fr3: t.CUInt64T = 0 + fr4: t.CUInt64T = 0 + c.Asm(f"""mov rax, [_fault_rbp] + mov {c.AsmOut(fr0, t.ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [rax + 8] + mov {c.AsmOut(fr1, t.ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [_fault_rbp] + mov rax, [rax] + mov {c.AsmOut(fr2, t.ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [rax + 8] + mov {c.AsmOut(fr3, t.ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [_fault_rbp] + mov rax, [rax] + mov rax, [rax] + mov rax, [rax + 8] + 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) + serial.puts(stk_buf) elif interrupt == 13: gp_rip: t.CUInt64T = 0 gp_err: t.CUInt64T = 0 diff --git a/VKernel/Kernel/intr/isr.s b/VKernel/Kernel/intr/isr.s index 5ddfb5d..a710b14 100644 --- a/VKernel/Kernel/intr/isr.s +++ b/VKernel/Kernel/intr/isr.s @@ -9,6 +9,7 @@ .comm _fault_rip, 8, 8 .comm _fault_err, 8, 8 .comm _fault_rsp, 8, 8 +.comm _fault_rbp, 8, 8 .section .text .intel_syntax noprefix @@ -96,6 +97,7 @@ isr\num\()_frame_ready: push rsi push rdi push rbp + mov [_fault_rbp], rbp push r8 push r9 push r10 @@ -279,6 +281,7 @@ isr\num\()_frame_ready: push rsi push rdi push rbp + mov [_fault_rbp], rbp push r8 push r9 push r10