kernel: 5.10
arch: arm64
int __init_memblock memblock_remove(phys_addr_t base, phys_addr_t size)
{
phys_addr_t end = base + size - 1;
memblock_dbg("%s: [%pa-%pa] %pS\n", __func__,
&base, &end, (void *)_RET_IP_);
return memblock_remove_range(&memblock.memory, base, size);
}
memblock_remove将物理地址区间[base, base+size]从memblock.memory管理的区间中删除,它主要调用了memblock_remove_range来完成这个工作
static int __init_memblock memblock_remove_range(struct memblock_type *type,
phys_addr_t base, phys_addr_t size)
{
int start_rgn, end_rgn;
int i, ret;
ret = memblock_isolate_range(type, base, size, &start_rgn, &end_rgn);
if (ret)
return ret;
for (i = end_rgn - 1; i >= start_rgn; i--)
memblock_remove_region(type, i);
return 0;
}
memblock_remove_range就是将物理地址为[base, base+size]区间所表示的memblock_region区间从memblock_type中删除
-
memblock_isolate_range 它会遍历memblock_type的所有memblock_region区间,将请求区间(base,size)与memblock_type重叠的memblock_region区间分离出来,如果请求区间可能跨越memblock_region的边界,需要进行分离,并创建新的memblock_region区间,最后通过start_rgn 和end_rgn记录分离区间的索引
-
memblock_remove_region:将区间memblock_region从memblock_type中移除