From d4200f1129dd7ae97c51efef7c549e212761ec1a Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 26 Aug 2026 19:11:22 +0800 Subject: [PATCH] =?UTF-8?q?debug(mm):=20=E6=97=A0=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E6=89=93=E5=8D=B0=20memmap=20=E4=B8=89=E5=8F=82=E6=95=B0=20+?= =?UTF-8?q?=20fallback=20CMOS=20=E5=8E=9F=E5=A7=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit serial.log 显示 memmap 分支(d[..] 转储 / mm: best=)从未打印 → 分支未执行, size≈4GB 来自 fallback 的 detect_memory_size()(CMOS 读到垃圾)。加两处诊断: 1) init 开头无条件打印 MemmapAddr/MemmapSize/MemmapDescSize; 2) fallback 打印 CMOS 0x15-0x18 与 detect_memory_size 结果。 --- VKernel/Kernel/mm/mm.vp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/VKernel/Kernel/mm/mm.vp b/VKernel/Kernel/mm/mm.vp index b46363b..50f56e5 100644 --- a/VKernel/Kernel/mm/mm.vp +++ b/VKernel/Kernel/mm/mm.vp @@ -503,6 +503,11 @@ def free_memory_regions() -> t.CStatic | t.CVoid: def init(MemmapAddr: t.CUInt64T, MemmapSize: t.CUInt64T, MemmapDescSize: t.CUInt64T, FbAddr: t.CUInt64T = 0, FbSize: t.CUInt64T = 0): global BuddySystemObject import drivers.serial.uart.serial as serial + # [DBG] 无条件打印 memmap 三参数,判定分支未走的根因(用后移除) + _dk0: t.CArray[t.CChar, 100] + viperlib.snprintf(c.Addr(_dk0), 100, "[mm] raw addr=0x%lx size=%lu desc=%lu\n", + MemmapAddr, MemmapSize, MemmapDescSize) + serial.puts(c.Addr(_dk0)) start_addr: t.CVoid | t.CPtr = None size: t.CUInt64T = 0 if MemmapAddr != 0: @@ -574,6 +579,14 @@ def init(MemmapAddr: t.CUInt64T, MemmapSize: t.CUInt64T, MemmapDescSize: t.CUInt start_addr = t.CVoid(best_start, t.CPtr) size = max_memory if start_addr is None: + # [DBG] fallback:打印 detect_memory_size 与 CMOS 原始值(用后移除) + _dc0: t.CArray[t.CChar, 100] + viperlib.snprintf(c.Addr(_dc0), 100, "[mm] fallback cmos 0x%02x 0x%02x 0x%02x 0x%02x\n", + cmos_read(0x15), cmos_read(0x16), cmos_read(0x17), cmos_read(0x18)) + serial.puts(c.Addr(_dc0)) + _dsz: t.CUInt64T = detect_memory_size() + viperlib.snprintf(c.Addr(_dc0), 100, "[mm] fallback detect=%lu\n", _dsz) + serial.puts(c.Addr(_dc0)) size = detect_memory_size() size = align_4k(size) # 起始地址 4MB(内核之后),避免超出物理 RAM