memblock_remove

本文深入探讨了Linux内核在arm64架构下,如何使用memblock_remove及其相关函数从内存区块管理中删除指定区域。通过对memblock_remove_range和memblock_isolate_range的分析,揭示了内核如何处理物理地址区间,包括检查、分离和移除内存区域的过程。这些函数确保了内核在初始化阶段对物理内存的有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中删除

  1. memblock_isolate_range 它会遍历memblock_type的所有memblock_region区间,将请求区间(base,size)与memblock_type重叠的memblock_region区间分离出来,如果请求区间可能跨越memblock_region的边界,需要进行分离,并创建新的memblock_region区间,最后通过start_rgn 和end_rgn记录分离区间的索引

  2. memblock_remove_region:将区间memblock_region从memblock_type中移除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值