memlbock的初始化过程
第二阶段建立的是 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);
1
2
3
4
5
6
7
8
9
10
11
12
13
其他
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);
上一篇:OK6410A 开发板 (八) 40 linux-5.11 OK6410A buddy 的 alloc 和 free
下一篇:OK6410A 开发板 (八) 38 linux-5.11 OK6410A 为什么需要这么多内存管理器
推荐阅读最新更新时间:2024-11-10 03:16
设计资源 培训 开发板 精华推荐
- LT6656BIDC-5、5V 升压输出电流电压基准的典型应用
- 基于S2-LP的Sub-1GHz(452-527 MHz)收发器开发套件
- MIC2164YMM 20A EV,MIC2164 评估套件,3.3V DC 至 DC 单输出电源,适用于台式 PC 电源
- LT1425、5V 至 -9V/250mA 隔离式 LAN 电源
- 使用 Analog Devices 的 LTC1149 的参考设计
- ISM330DLC适配器板,标准DIL24插座
- DC814D-J,使用 LTC6908-1 50KHz 至 10MHz 固定频率硅振荡器的演示板
- 使用 Analog Devices 的 REF198GRUZ-REEL 的参考设计
- Si7050 Si1133 温度传感器的典型应用
- stm32最小系统
- 下载有礼|ADI 最新《模拟对话》合订本
- 幸运十一月,器件购买e问e答!
- ADI有奖下载活动之15 ADI公司智能可穿戴医疗保健设备解决方案
- 有奖直播: 解读安森美半导体电源解决方案 ,聚焦服务器电源、光伏逆变器
- 直播已结束【大唐恩智浦具有阻抗检测功能的新能源锂电芯电池管理方案】
- 【最后1天】MPS 有奖倾诉|说出哪些年让你头大的电感应用问题,赢【颈部按摩仪、智能音箱】
- TI直播:精讲“双向CLLLC谐振、双有源电桥(DAB)参考设计”
- 学《TIVA C Launchpad入门课程》 晒成绩 赢大礼!
- 真香!泰克示波器全新升级,速来解锁!不看感觉错过一个亿!
- 有奖答题|TE《新能源应用解决方案白皮书》