From 25af08ecf4c16557d35c68bd913f9b793f229e4c Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 29 Aug 2026 18:00:13 +0800 Subject: [PATCH] =?UTF-8?q?debug(kernel):=20=E4=BF=9D=E5=AD=98=E5=B9=B6?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=B4=A9=E6=BA=83=E6=97=B6=20RAX=EF=BC=88?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=20cr2=3Drax-=E5=81=8F=E7=A7=BB=20=E5=85=B3?= =?UTF-8?q?=E7=B3=BB=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [STK] 显示崩溃帧 rbp=0x7d640 正常,但 cr2=0x0 需 rax=0x6f0——矛盾待解。isr.s 新增 _fault_rax,异常打印 [RAX] 行确认崩溃时 rax 真实值。 --- VKernel/Kernel/intr/idt.vp | 14 ++++++++++++++ VKernel/Kernel/intr/isr.s | 3 +++ 2 files changed, 17 insertions(+) diff --git a/VKernel/Kernel/intr/idt.vp b/VKernel/Kernel/intr/idt.vp index 1686761..2b319d2 100644 --- a/VKernel/Kernel/intr/idt.vp +++ b/VKernel/Kernel/intr/idt.vp @@ -124,6 +124,13 @@ 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) + # [RAX] 崩溃时 rax(isr.s 保存):定位 cr2 与 rax 关系(rax-偏移=cr2) + f_rax: t.CUInt64T = 0 + c.Asm(f"""mov {c.AsmOut(f_rax, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rax]""", + op=[t.ASM_DESCR.CLOBBER_RAX]) + rax_buf: t.CArray[t.CChar, 80] + viperlib.snprintf(c.Addr(rax_buf), 80, "[RAX] rax=0x%lx\n", f_rax) + serial.puts(rax_buf) # [STK] rbp 链回溯(定位栈损坏源:崩溃帧 + 4 级调用链的返回地址) fr0: t.CUInt64T = 0 fr1: t.CUInt64T = 0 @@ -177,6 +184,13 @@ def isrCommonhandler(interrupt: t.CInt): ex_buf: t.CArray[t.CChar, 100] viperlib.snprintf(c.Addr(ex_buf), 100, "[EX] int=%d rip=0x%lx rsp=0x%lx\n", interrupt, ex_rip, ex_rsp) serial.puts(ex_buf) + # [RAX] 崩溃时 rax(isr.s 保存) + f_rax: t.CUInt64T = 0 + c.Asm(f"""mov {c.AsmOut(f_rax, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rax]""", + op=[t.ASM_DESCR.CLOBBER_RAX]) + rax_buf: t.CArray[t.CChar, 80] + viperlib.snprintf(c.Addr(rax_buf), 80, "[RAX] rax=0x%lx\n", f_rax) + serial.puts(rax_buf) # [STK] rbp 链回溯(与 #PF 分支一致,定位栈损坏源) fr0: t.CUInt64T = 0 fr1: t.CUInt64T = 0 diff --git a/VKernel/Kernel/intr/isr.s b/VKernel/Kernel/intr/isr.s index a710b14..f695f60 100644 --- a/VKernel/Kernel/intr/isr.s +++ b/VKernel/Kernel/intr/isr.s @@ -10,6 +10,7 @@ .comm _fault_err, 8, 8 .comm _fault_rsp, 8, 8 .comm _fault_rbp, 8, 8 +.comm _fault_rax, 8, 8 .section .text .intel_syntax noprefix @@ -92,6 +93,7 @@ isr\num\()_frame_ready: # Push all general-purpose registers push rax + mov [_fault_rax], rax push rbx push rdx push rsi @@ -277,6 +279,7 @@ isr\num\()_frame_ready: # Push all general-purpose registers push rax + mov [_fault_rax], rax push rbx push rsi push rdi