memblock是linux用于管理内存的一种机制。
接下来说一些这个机制的初始化,以及其操作方法。
先看一下memblock中使用的结构体:
//memblock中的flag
enum {
MEMBLOCK_NONE = 0x0, /* No special request */
MEMBLOCK_HOTPLUG = 0x1, /* hotpluggable region */
MEMBLOCK_MIRROR = 0x2, /* mirrored region */
};
struct memblock_region {
phys_addr_t base; //region的基地址
phys_addr_t size; //region的大小
unsigned long flags; //region的标志
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAP
int nid; //属于哪个noid
#endif
};
struct memblock_type {
unsigned long cnt; /*当前regions的数量 */
unsigned long max; /*当前集合中可记录的n内存区域的最大大小*/
phys_addr_t total_size; /*region的总大小*/
struct memblock_region *regions; //指向内存区域
};
struct memblock {
bool bottom_up; /*表示分配器的分配方式,true从低地址向高地址分配,false则相反*/
phys_addr_t current_limit; //指出n内存块的大小限制,
struct memblock_type memory;//可用内存
struct memblock_type reserved;//已分配内存
};
memblock的初始化:
#define INIT_MEMBLOCK_REGIONS 128
/*可分配内存区域*/
static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
/*已分配内存区域*/
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
struct memblock memblock __initdata_memblock = {
.memory.regions = memblock_memory_init_regions,
.memory.cnt = 1, /* empty dummy entry */
.memory.max = INIT_MEMBLOCK_REGIONS,
.reserved.regions = memblock_reserved_init_regions,
.reserved.cnt = 1, /* empty dummy entry */
.reserved.max = INIT_MEMBLOCK_REGIONS,
.bottom_up = false,
.current_limit = MEMBLOCK_ALLOC_ANYWHERE,
};
memblock的操作函数:
加入操作
//把基址为base,大小为size的内存区域加入memblock中,并标记node号为nid
int __init_memblock memblock_add_node(phys_addr_t base, phys_addr_t size,int nid)
{
return memblock_add_range(&memblock.memory, base, size, nid, 0);
}
移除操作
//从memblock中去除基址为base,大小为size的区域
int __init_memblock memblock_remove(phys_addr_t base, phys_addr_t size)
{
return memblock_remove_range(&memblock.memory, base, size);
}
释放操作:
//释放一段基址为base,大小为size的区域
int __init_memblock memblock_free(phys_addr_t base, phys_addr_t size)
{
//调用memblock_remove_range把这个区域删除
return memblock_remo