From f9ec2058161c05eae704e176a55629d5387e3c92 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 26 Aug 2026 19:02:40 +0800 Subject: [PATCH] =?UTF-8?q?debug(mm):=20=E8=BD=AC=E5=82=A8=20memmap=20?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E7=AC=A6=20+=20buddy=20=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E5=BE=AA=E7=8E=AF=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mm.init 报 start=0x400000 size=4292411392(≈4GB)后挂起——256MB 内存不该有 4GB 可用区,怀疑 memmap 描述符读到垃圾。新增:1) init 内转储全部描述符 (type/start/pages);2) buddy __init__ 循环打印前 6 次迭代与 loop done 标记, 定位挂起点。 --- VKernel/Kernel/mm/mm.vp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/VKernel/Kernel/mm/mm.vp b/VKernel/Kernel/mm/mm.vp index 8afa54d..02994fe 100644 --- a/VKernel/Kernel/mm/mm.vp +++ b/VKernel/Kernel/mm/mm.vp @@ -104,6 +104,10 @@ class _BuddySystemObject: self.buddy.end_addr = t.CVoid(t.CUInt64T(start_addr) + size, t.CPtr) remaining: t.CUInt64T = size cur_addr: t.CUInt64T = t.CUInt64T(start_addr) + # [DBG] buddy 初始化循环进度(用后移除) + import drivers.serial.uart.serial as _sdbg + _dbp: t.CArray[t.CChar, 80] + _itc: t.CInt = 0 while remaining >= MIN_BLOCK_SIZE: order: t.CInt = 0 tmp: t.CUInt64T = remaining @@ -115,6 +119,11 @@ class _BuddySystemObject: order -= 1 block_size = get_block_size(order) if block_size > remaining: break + _itc += 1 + if _itc <= 6: + viperlib.snprintf(c.Addr(_dbp), 80, "[mm] it=%d order=%d bs=0x%lx addr=0x%lx rem=%lu\n", + _itc, order, block_size, cur_addr, remaining) + _sdbg.puts(c.Addr(_dbp)) block: memory_block | t.CPtr = cur_addr block.size = block_size block.state = BLOCK_FREE @@ -128,6 +137,7 @@ class _BuddySystemObject: self.buddy.free_lists[order] = block cur_addr += block_size remaining -= block_size + _sdbg.puts("[mm] buddy loop done\n") # DEBUG: print free_lists status after init import drivers.serial.uart.serial as serial _dmsg: t.CArray[t.CChar, 40] @@ -506,6 +516,13 @@ def init(MemmapAddr: t.CUInt64T, MemmapSize: t.CUInt64T, MemmapDescSize: t.CUInt best_ld_size: t.CUInt64T = 0 best_ld_start: t.CUInt64T = 0 i: t.CUInt64T + # [DBG] 转储全部 memmap 描述符,定位 4GB 伪可用区的来源(用后移除) + for i in range(num_entries): + entry: bootinfo.memory_map_entry | t.CPtr = t.CVoid(MemmapAddr + i * MemmapDescSize, t.CPtr) + _dbgd: t.CArray[t.CChar, 100] + viperlib.snprintf(c.Addr(_dbgd), 100, "[mm] d[%lu] t=%lu start=0x%lx np=%lu\n", + i, t.CUInt64T(entry.type), entry.physical_start, entry.num_pages) + serial.puts(c.Addr(_dbgd)) for i in range(num_entries): entry: bootinfo.memory_map_entry | t.CPtr = t.CVoid(MemmapAddr + i * MemmapDescSize, t.CPtr) etype: t.CUInt64T = entry.type