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:
1 parent
3995cb9545
commit
f9ec205816
1 file changed
+17
@@ -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
|
||||
|
||||
Reference in new issue
Block a user