Linux内存细节 reserve_bootmem_node

本文详细分析了Linux内核中初始化内存分配的函数`__initreserve_bootmem_node`和`__init__reserve`的工作流程。通过参数计算得出内存页的占用状态,并利用位图管理内存分配,确保内存的正确分配和使用。在位图中,第431位被置为1,表示该页已被占用。
摘要由CSDN通过智能技术生成

假如内存的物理起始地址为:0x30000000, 大小为:0x1000000


int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
                 unsigned long size, int flags)
{
    unsigned long start, end;
 
    start = PFN_DOWN(physaddr);//0x30431
    end = PFN_UP(physaddr + size); //0x30432
 
    return mark_bootmem_node(pgdat->bdata, start, end, 1, flags);
}

先看一下主调函数传进来的参数的值
pgdat->bdata->node_min_pfn = 0x30000
pgdat->bdata->node_low_pfn = 0x31000
pgdat->bdata->node_bootmem_map = 0xc0431000
physaddr = boot_pfn << PAGE_SHIFT = 0x30431 << 12 = 0x30431000
size = boot_pages << PAGE_SHIFT = 1 << 12 = 0x1000(4K)
flags = BOOTMEM_DEFAULT = 0
所以根据上面传递的参数值,可以计算出:
start = PFN_DOWN(physaddr) = 0x30431
end = PFN_UP(physaddr + size) = 0x30432
最后调用mark_bootmem_node函数,该函数前面已经分析过,这里就不过分析了,根据参数的不同,最后该函数又调用__reserve函数

static int __init __reserve(bootmem_data_t *bdata, unsigned long sidx,
            unsigned long eidx, int flags)
{
    unsigned long idx;
    /* BOOTMEM_EXCLUSIVE表示是否要求独占这块bootmem */
    int exclusive = flags & BOOTMEM_EXCLUSIVE;
 
    bdebug("nid=%td start=%lx end=%lx flags=%x\n",
        bdata - bootmem_node_data,
        sidx + bdata->node_min_pfn,
        eidx + bdata->node_min_pfn,
        flags);
 
    for (idx = sidx; idx < eidx; idx++)
        if (test_and_set_bit(idx, bdata->node_bootmem_map)) {
            /* 在这之前已经置为1,说明有人正在使用这块内存 */
            if (exclusive) {
                 /* 如果是独占型的,独占失败,将之前已经置1的比特位清0 */
                __free(bdata, sidx, idx);
                return -EBUSY;
            }
            /* 非独占,打印重复置1的提示信息 */
            bdebug("silent double reserve of PFN %lx\n",
                idx + bdata->node_min_pfn);
        }
    return 0;
}

主调函数传递进来的参数值为:
bdata->node_min_pfn = 0x30000
bdata->node_low_pfn = 0x31000
bdata->node_bootmem_map = 0xc0431000
sidx = 431
eidx = 432
flags = 0
该函数和前面的__free函数比较相拟,只不过它调用的是test_and_set_bit函数,而该函数和
test_and_clear_bit函数相拟,区别:这里是对相应的位置1


那么最后上面的操作完成后的效果是:
bdata->node_bootmem_map[0xc0431000]地址处的512个字节的数据中,第431位被置为1
表示该页被占用,其中前512个字节用于bootmem_map关于内存使用情况的描述.
————————————————
版权声明:本文为CSDN博主「zwmyxfbenet」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zwmyxfbenet/article/details/25713043

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值