在 mm.c
中定义了内存池的起始地址,是 24M
#define PHYSICAL_MEM_START (24 * 1024 * 1024) // 24M
#define START_VADDR phys_to_virt(PHYSICAL_MEM_START) // 24M
那么对于 order 为 11 的第一个内存块 0xffffff0001800000
,按照 buddy.c
中初始的 get_buddy_chunk
逻辑,计算得到的它的 buddy chunk 地址为 0xffffff0001000000
, 但是这个 chunk 并不是当前情况下我们想要找到的 buddy chunk,实际的 buddy 为 ffffff0001800000 + 800000
order=11 的块大小为 8M,24 不是 8 的偶数倍,因此产生了这个问题。如果修改 get_buddy_chunk 的逻辑就不能直接通过为运算得到 buddy 了。