From d96b6322264d78d2e97814600500803783a5e87e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 16 Oct 2026 19:19:00 +0800 Subject: [PATCH] =?UTF-8?q?chore(main):=20=E5=88=A0=E6=8E=89=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E8=BA=AB=E4=BB=BD=E4=B8=8B=E8=B0=83=20slog.so=20log?= =?UTF-8?q?=5Finfo=20=E7=9A=84=E5=90=AF=E5=8A=A8=E5=86=92=E7=83=9F?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S4 之后 log_info 走 open(/dev/serial0)+write 两个 syscall,而该调用点在 devfs_init/devfs_register_serial0 之前 ⇒ 那条日志必然丢失。直接删除这个早期验证用的冒烟调用(动态库路径仍被 HelloWorld 的 dynlib.load_so/so_call1 与内核 LOAD_SO/SO_CALL1 覆盖)。同步更新上方的自启动说明注释。 --- VKernel/Kernel/main.vp | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/VKernel/Kernel/main.vp b/VKernel/Kernel/main.vp index 2d9e2b3..6a45c13 100644 --- a/VKernel/Kernel/main.vp +++ b/VKernel/Kernel/main.vp @@ -209,9 +209,9 @@ class ViperKernel: else: serial.puts("[main] APPS dir not found\n") - # 还原 elf 自启动(初版 6813947 的 main.py,改写为新语法):sched 暂停 → - # 逐个 spawn .elf(hello / terminal / gargantua / scene3d)→ 加载 slog.so 做一次 - # log_info 冒烟调用 → sched 恢复。spawn 要在 FAT32 破坏性测试之前完成。 + # elf 自启动:sched 暂停 → 逐个 spawn .elf(hello / terminal / gargantua / + # scene3d / explorer)→ sched 恢复。spawn 要在 FAT32 破坏性测试之前完成。 + # (原来还在这里加载 slog.so 调一次 log_info 冒烟,S4 后已删除,见下方说明。) sched.Scheduler.disable() hello_pid: int = elf.spawn_elf("/APPS/hello.elf") @@ -257,25 +257,11 @@ class ViperKernel: viperlib.snprintf(&exp_log, 64, "[main] Explorer spawned as pid=%d\n", exp_pid) serial.puts(&exp_log) - so_base: rawptr = elf.load_so("/LIBS/SLOG.SO") - if so_base is not None: - serial.puts("[main] slog.so loaded, calling log_info...\n") - log_info_fn: rawptr = elf.get_so_symbol(so_base, "log_info", "/LIBS/SLOG.SO") - if log_info_fn is not None: - msg: const str = "Hello from shared library!" - # 与 intr/syscall.vp 的 SO_CALL1 同款:按 SysV 把第一个实参放 rdi, - # 再 call 符号地址(日志函数不需要返回值)。 - __asm__(f"""mov rdi, {asminp(msg, ASM_DESCR.REG_ANY)} - call {asminp(log_info_fn, ASM_DESCR.REG_ANY)}""", - op=[ASM_DESCR.CLOBBER_MEMORY, ASM_DESCR.CLOBBER_RAX, - ASM_DESCR.CLOBBER_RCX, ASM_DESCR.CLOBBER_RDX, - ASM_DESCR.CLOBBER_RDI, ASM_DESCR.CLOBBER_RSI, - ASM_DESCR.CLOBBER_R8, ASM_DESCR.CLOBBER_R9, - ASM_DESCR.CLOBBER_R10, ASM_DESCR.CLOBBER_R11]) - else: - serial.puts("[main] log_info symbol not found\n") - else: - serial.puts("[main] failed to load slog.so\n") + # 原这里在**内核身份**下调 slog.so 的 log_info 做冒烟测试;S4 之后 + # log_info 变成 open(/dev/serial0)+write 两个 syscall,而此处执行在 + # devfs 注册之前,那条日志必然丢失 ⇒ 直接删掉这个早期验证用的冒烟调用。 + # 动态库路径本身仍被 HelloWorld(dynlib.load_so + so_call1)与内核 + # LOAD_SO/SO_CALL1 syscall 覆盖,没有失去覆盖。 sched.Scheduler.enable()