From d58833d3b5423eb358ac7035999c7ef8ea86a43d Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 14:47:53 +0800 Subject: [PATCH] =?UTF-8?q?diag(vkernel):=20=E5=A2=9E=E5=8A=A0=20post=5Fvg?= =?UTF-8?q?a=20/=20pre=5Fstart=20=E6=8E=A2=E9=92=88=EF=BC=8C=E5=A4=B9?= =?UTF-8?q?=E5=87=BA=20fb/pitch=20=E8=A2=AB=E6=B8=85=E9=9B=B6=E7=9A=84?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [rc] preflush 显示 fb=0x0(帧缓冲指针为 NULL),[dst] entry 显示 pitch=0: 刷新循环把 8MB 后备缓冲写到物理 0x0 起 —— 覆盖 IVT/BDA + 低端内存 + 内核镜像自身 (0x100000 起),边跑边覆盖正在执行的代码 → 卡死;QEMU 因客户机跑飞 abort(0x40000015 = STATUS_FATAL_APP_EXIT)。 VGA 文本(315-317 行)用同一组 fb/pitch 画出来是正常的,说明清零发生在 317 行之后、323 行 desktop.start 之前。故加两条探针把元凶夹死: _WhProbe("post_vga", uint32(fb), pitch) # 317 行后 _WhProbe("pre_start", uint32(fb), pitch) # 323 行前 若 post_vga 正常而 pre_start 为 0,元凶即这三条之一: serial.puts("你好") / serial.puts("[main] starting desktop") / _WhProbe("pre_desktop")。 --- VKernel/Kernel/main.vp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VKernel/Kernel/main.vp b/VKernel/Kernel/main.vp index 9094275..ca83fe0 100644 --- a/VKernel/Kernel/main.vp +++ b/VKernel/Kernel/main.vp @@ -315,10 +315,12 @@ class ViperKernel: VGA_drv = vga._VGAScreenDriver(fb, width, height, pitch, fb_format) self.VGA = &VGA_drv self.VGA.Print(100, 100, "ViperOS VKernel Test") + _WhProbe("post_vga", uint32(fb), pitch) serial.puts("你好\n") serial.puts("[main] starting desktop\n") _WhProbe("pre_desktop", width, height) + _WhProbe("pre_start", uint32(fb), pitch) mm.DumpBuddy() desktop.start(fb, width, height, pitch) serial.puts("[main] desktop started\n")