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