博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 39 linux-5.11 OK6410A memblock 的 alloc 和 free
阅读量:4285 次
发布时间:2019-05-27

本文共 1932 字,大约阅读时间需要 6 分钟。

第二阶段建立的是 memblock
  • memblock 的管理范围
ATAG_MEM 或ATAG_CMDLINE  mem=size@startmemblock 的管理范围 是 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_allocmemblock_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_freememblock_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);

转载地址:http://ujigi.baihongyu.com/

你可能感兴趣的文章
怎么解决div覆盖内容却没覆盖的问题?
查看>>
九个Console命令,让js调试更简单
查看>>
Linux与Windows的8个不同
查看>>
如何给超链接设置宽度和高度
查看>>
趣文:你对程序员适不适合做老公的看法是?
查看>>
仿照某商城首页的源代码及效果
查看>>
网络大牛如何回答Chrome的15个刁钻面试题?
查看>>
某网站静态首页的实现小结
查看>>
常用的正则表达式归纳—JavaScript正则表达式
查看>>
jq实现图片轮播:圆形焦点+左右控制+自动轮播
查看>>
问题:关于贴友分类菜单的实现
查看>>
PHP图像操作:3D图、缩放、旋转、裁剪、添加水印(二)
查看>>
PHP图像操作:3D图、缩放、旋转、裁剪、添加水印(三)
查看>>
document.body、document.documentElement和window获取视窗大小的区别
查看>>
教你利用iframe在网页中显示天气
查看>>
利用Javascript获取当前日期的农历日期
查看>>
利用原生JavaScript获取样式的方式小结
查看>>
PHP制作验证码
查看>>
常用的CSS Hack技术集锦
查看>>
IE 8兼容:X-UA-Compatible的解释
查看>>