debug(mm): 转储 memmap 描述符 + buddy 初始化循环进度

mm.init 报 start=0x400000 size=4292411392(≈4GB)后挂起——256MB 内存不该有
4GB 可用区,怀疑 memmap 描述符读到垃圾。新增:1) init 内转储全部描述符
(type/start/pages);2) buddy __init__ 循环打印前 6 次迭代与 loop done 标记,
定位挂起点。
This commit is contained in:
TermiNexus committed 2026-08-26 19:02:40 +08:00
1 parent 3995cb9545
commit f9ec205816
1 file changed
+17
+17
View File
@@ -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