memblock

Memblock子系统

memblock从bootmem发展而来,具体区别等以后补充,下方链接先做参考

memblock和bootmem的区别

知识点:
- memblock存在的意义
- memblock如何管理内存区域
- memblock对于reserved内存区域管理

memblock存在的意义

在系统刚启动时,伙伴系统,slab分配器都没有初始化,为了应对早期的内存分配需求,从而有了memblock系统
另外,一些reserved的memory也不会被添加到伙伴系统中去,这部分内存也记录在memblock系统中

memblock如何管理内存区域

memblock系统自身也需要一定的内存来保存自己所需要的数据结构,memblock系统如何做到?
1. 在初始化阶段,使用静态定义的数据结构 memblock静态数据结构
2. 在 memblock_double_array ,该函数在slab初始化完成之后,就会从slab中分配用来管理自身数据结构的内存,并且free。
3. 在初始化完成之后会调用 memblock_discard memblock_discard 释放memblock初始化阶段使用的内容
4. __initdata_memblock修饰的变量会放在.meminit.data, 连接脚本最总会链接到.init.data段,在free init memory时释放掉。

在系统启动时,会调用

early_init_dt_scan_nodes
of_scan_flat_dt(early_init_dt_scan_memory, NULL);
int __init early_init_dt_scan_memory(unsigned long node, const char *uname, int depth, void *data)

查找/memory结点获取内存信息 (该节点一般由bootloader程序根据获取到的DDR信息,添加到memblock系统中)

memblock如何保存内存block?

见下述三个结构体,以及/d/memblock/memory的实现。
在memblock添加内存,设置状态时,会自动风格内存区域,自动merge,看代码即可。

struct memblock_region {
    phys_addr_t base;
    phys_addr_t size;
    unsigned long flags;
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
    int nid;
#endif
};

struct memblock_type {
    unsigned long cnt;  /* number of regions */
    unsigned long max;  /* size of the allocated array */
    phys_addr_t total_size; /* size of all regions */
    struct memblock_region *regions;
    char *name;
};

struct memblock {
    bool bottom_up;  /* is bottom up direction? */
    phys_addr_t current_limit;
    struct memblock_type memory;
    struct memblock_type reserved;
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
    struct memblock_type physmem;
#endif
};

相关链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注