OK6410A 开发板 (八) 39 linux-5.11 OK6410A memblock 的 alloc 和 free

第二阶段建立的是 memblock
  • memblock 的管理范围
ATAG_MEM 
或
ATAG_CMDLINE  mem=size@start

memblock 的管理范围 是 u-boot  决定的
u-boot 可以在这个过程中 预留内存
  • memblock 的使用期限
从 start_kernel->setup_arch->paging_init->bootmem_init->memblock_allow_resize 返回
到 kernel_init(进程1) -> free_initmem 

其实从 mem_init返回 -> free_initmem  ,memblock 其实只是能用而已
在这个阶段,已经存在一个buddy了, memblock 如果也使用的话,就会造成内存管理的混乱(两个内存管理器管理了大约相同的内存)



memblock 相关的函数 都是 用 __init 修饰的,
在 free_initmem 的时候会被释放掉
所以就再也不能用 memblock_alloc 来申请内存了.

实际上 mm_init 函数执行之前 , 就没有使用过 memblock_alloc 了

memblock 的使用方法
  • alloc memblock_alloc
alloc方法 是 memblock_alloc

memblock_alloc
	memblock_alloc_try_nid
		memblock_alloc_internal
			phys_addr_t alloc = memblock_alloc_range_nid
				// 1. 找到起始物理地址
				phys_addr_t found = memblock_find_in_range_node
					__memblock_find_range_bottom_up
						for_each_free_mem_range round_up
				// 2. reserve 这段地址
				memblock_reserve(found, size);
				return found;
			return phys_to_virt(alloc);

  • free memblock_free
free方法 是 memblock_free
memblock_free
	memblock_remove_range(&memblock.reserved, base, size);
		// 如果该内存块在 memblock.reserved 成员 范围内,则需要先将其摘出来成为一个 memblock.reserved 成员(即 memblock.reserved)
		// 例如 memblock.reserved 一个成员A 为 0x0000 0000 - 0x2000 0000 
		// 而你要free 的 内存区域 为 0x1000 0000 - 0x2000 0000
		// 就需要将 A 删掉
		// 新增 B : 0x0000 0000 - 0x1000 0000
		// 新增 C : 0x1000 0000 - 0x2000 0000
		memblock_isolate_range(type, base, size, &start_rgn, &end_rgn); // 隔离
		// 将 B 移除
		memblock_remove_region(type, i);
		
其他
memblock_reserve
	memblock_add_range(&memblock.reserved, base, size, MAX_NUMNODES, 0);
		
		// 第一次 // memblock.reserved 的第一个成员
		type->regions[0].base = base;
		type->regions[0].size = size;
		type->regions[0].flags = flags;
		
		// 第(N>=2)次 // memblock.reserved 的 第二个成员
		
		第一次循环 : 
			// memblock.reserved 增加数组大小
			memblock_double_array
			insert = true;
		第二次循环 :
			// 先 插入
			if (base < end) if (insert) memblock_insert_region(type, idx, base, end - base, nid, flags)
			// 再 merge
			memblock_merge_regions(type);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值