linux中memblock的使用

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值