From 2b0d68d3fee774d8d9a512b37f3f4e0de6eb10d8 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 27 Aug 2026 01:24:26 +0800 Subject: [PATCH] =?UTF-8?q?debug(elf):=20read=5Flen=20=E5=90=8E=E5=8A=A0?= =?UTF-8?q?=20RAX=20=E5=BF=AB=E7=85=A7=E2=80=94=E2=80=94fat32.read=20?= =?UTF-8?q?=E6=89=93=E5=8D=B0=20br=3D64=20=E4=BD=86=20load=5Felf=20?= =?UTF-8?q?=E6=94=B6=E5=88=B0=20rl=3D0=EF=BC=8C=E5=8C=BA=E5=88=86=20call?= =?UTF-8?q?=20=E8=BF=94=E5=9B=9E=E9=94=99=20vs=20store=20=E5=90=8E?= =?UTF-8?q?=E8=A2=AB=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VKernel/Kernel/execrunner/elf.vp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/VKernel/Kernel/execrunner/elf.vp b/VKernel/Kernel/execrunner/elf.vp index a2b4aca..3275859 100644 --- a/VKernel/Kernel/execrunner/elf.vp +++ b/VKernel/Kernel/execrunner/elf.vp @@ -130,10 +130,12 @@ def load_elf(path: t.CConst | str, do_map: t.CInt = 1) -> t.CVoid | t.CPtr: ehdr_buf: t.CArray[t.CUInt8T, 64] string.memset(c.Addr(ehdr_buf), 0, 64) read_len: t.CUInt32T = fat32.read(fp, c.Addr(ehdr_buf), 64) - # [DIAG] read_len 实际值(fat32.read 内部打印 br=64 但 load_elf 收到 <64 - # 触发 "failed to read ehdr" —— 跨模块返回值间歇性丢失) - _dbrl: t.CArray[t.CChar, 64] - viperlib.snprintf(c.Addr(_dbrl), 64, "[elf] read_len=%lu\n", read_len) + # [DIAG] read_len 实际值 + call 后 RAX 快照:区分"call 返回错"(rl=0 rax=0) + # vs "store 后 RAX 被覆盖"(rl=0 rax=64) + _rax_v2: t.CUInt64T = 0 + c.Asm(f"""mov {c.AsmOut(_rax_v2, t.ASM_DESCR.OUTPUT_REG)}, rax""", op=[t.ASM_DESCR.CLOBBER_MEMORY]) + _dbrl: t.CArray[t.CChar, 96] + viperlib.snprintf(c.Addr(_dbrl), 96, "[elf] rl=%lu rax=0x%lx\n", read_len, _rax_v2) serial.puts(c.Addr(_dbrl)) if read_len < 64: serial.puts("[elf] failed to read ehdr\n")