From 038b0a428efce3a441e5dc82d88018d88fb4718e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 27 Aug 2026 00:45:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(ide,elf):=20=E7=A7=BB=E9=99=A4=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E8=AF=BB=E6=89=87=E5=8C=BA=E5=89=8D=E7=9A=84=200x3F6?= =?UTF-8?q?=20SRST=20=E8=BD=AF=E5=A4=8D=E4=BD=8D=E5=86=99=EF=BC=88Gargantu?= =?UTF-8?q?a=20=E5=A4=A7=E6=95=B0=E6=8D=AE=E6=AE=B5=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E4=B8=AD=E9=80=94=20waitDataReady=20=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=A0=B9=E5=9B=A0=EF=BC=89=EF=BC=9Bspawn=5Felf=20=E7=94=A8?= =?UTF-8?q?=E6=8C=87=E9=92=88=E7=AE=97=E6=9C=AF=E6=9B=BF=E4=BB=A3=20path[n?= =?UTF-8?q?ame=5Fstart:]=20=E5=88=87=E7=89=87=E4=BC=A0=E5=8F=82=E5=B9=B6?= =?UTF-8?q?=E5=8A=A0=20entry/pid=20=E8=BF=90=E8=A1=8C=E6=97=B6=E8=AF=8A?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VKernel/Kernel/drivers/storage/ide/ide.vp | 4 ++-- VKernel/Kernel/execrunner/elf.vp | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/VKernel/Kernel/drivers/storage/ide/ide.vp b/VKernel/Kernel/drivers/storage/ide/ide.vp index 3943256..256828d 100644 --- a/VKernel/Kernel/drivers/storage/ide/ide.vp +++ b/VKernel/Kernel/drivers/storage/ide/ide.vp @@ -92,7 +92,7 @@ def readSector(lba: t.CUInt32T, buffer: t.CVoid | t.CPtr) -> t.CInt: viperlib.snprintf(c.Addr(dbg), 120, "[readSector] waitReady err=%d\n", t.CInt(err)) serial.puts(dbg) return err - asm.outb(0x3F6, 0x02) + asm.outb(0x3F6, 0x00) asm.outb(0x1F2, 1) asm.outb(0x1F3, t.CUInt8T(lba & 0xFF)) asm.outb(0x1F4, t.CUInt8T((lba >> 8) & 0xFF)) @@ -119,7 +119,7 @@ def writeSector(lba: t.CUInt32T, buffer: t.CConst | t.CVoid | t.CPtr) -> t.CInt: if buffer is None: return IDError.IDE_ERR_BUFFER_NULL err: IDError = waitReady(IDE_baseport_PRIMARY) if err != IDError.IDE_ERR_NONE: return err - asm.outb(0x3F6, 0x02) + asm.outb(0x3F6, 0x00) asm.outb(0x1F2, 1) asm.outb(0x1F3, t.CUInt8T(lba & 0xFF)) asm.outb(0x1F4, t.CUInt8T((lba >> 8) & 0xFF)) diff --git a/VKernel/Kernel/execrunner/elf.vp b/VKernel/Kernel/execrunner/elf.vp index be34efc..c5438f3 100644 --- a/VKernel/Kernel/execrunner/elf.vp +++ b/VKernel/Kernel/execrunner/elf.vp @@ -322,6 +322,12 @@ def _elf_entry_wrapper(arg: t.CVoid | t.CPtr) -> t.CInt: proc.switch_pid(pid) cur_p: proc.Process | t.CPtr = proc.ProcessManager.current() entry_fn: t.CVoid | t.CPtr = cur_p.entry + # [DIAG] 定位用户进程首个指令 PF:打印 entry 实际值(PF cr2=ELF 物理区最后一页, + # 疑似 entry 被写成 phys 地址而非虚拟 0x400000)。 + _dbw: t.CArray[t.CChar, 160] + viperlib.snprintf(c.Addr(_dbw), 160, "[wrap] pid=%d cur=0x%lx ent=0x%lx ebase=0x%lx ks=0x%lx us=0x%lx\n", + pid, t.CUInt64T(cur_p), t.CUInt64T(entry_fn), cur_p.elf_base, cur_p.kern_stack, cur_p.user_stack) + serial.puts(c.Addr(_dbw)) if entry_fn is not None: user_stack_vtop: t.CUInt64T = USER_STACK_VTOP us_sz: t.CUInt64T = USER_STACK_SIZE @@ -442,7 +448,10 @@ def spawn_elf(path: t.CConst | str) -> t.CInt: paging.set_active_pml4(_kernel_cr3) asm.sti() - p: proc.Process | t.CPtr = proc.ProcessManager.create_process(path[name_start:], entry) + # path[name_start:] 切片表达式 translate_subscript 不支持 Slice(返回 None)→ + # 作为实参丢 name、entry 错位成第一参数(TPV 已修,此处指针算术双保险) + nm_ptr: t.CConst | t.CChar | t.CPtr = t.CConst(t.CUInt64T(path) + t.CUInt64T(name_start), t.CPtr) + p: proc.Process | t.CPtr = proc.ProcessManager.create_process(nm_ptr, entry) if p is None: serial.puts("[elf] spawn: create_process failed\n") fat32.unlock() @@ -463,6 +472,10 @@ def spawn_elf(path: t.CConst | str) -> t.CInt: slog: t.CArray[t.CChar, 80] viperlib.snprintf(c.Addr(slog), 80, "[elf] spawn: pid=%d tid=%d entry=0x%lx pml4=0x%lx\n", p.pid, tid, t.CUInt64T(entry), p.pml4_root) serial.puts(slog) + # [DIAG] 确认 return p.pid 的实际值(main 收到 pid=0 而此处打印 3) + _dbw2: t.CArray[t.CChar, 64] + viperlib.snprintf(c.Addr(_dbw2), 64, "[elf] spawn ret pid=%d\n", p.pid) + serial.puts(c.Addr(_dbw2)) fat32.unlock() return p.pid