return __memblock_find_range_bottom_up(start, end, size, align, nid, flags); else return __memblock_find_range_top_down(start, end, size, align, nid, flags); } memblock_find_in_range_node函数寻找 memblock 分配器在对应内存节点中符合要求的内存,找到后返回区间物理地址首地址。具体流程如下: ...
函数内部,直接调用memblock_find_in_range_node()完成查找功能。由于未指定查找节点,在memblock_find_in_range_node()函数中使用了最大节点MAX_NUMNODES,此时,允许从任意节点进行查找。 查找成功,返回找到的地址;失败,返回 0。 5.3.2 memblock_find_in_range_node() // file: mm/memblock.c /** * memblock_...
start = memblock_find_in_range(crash_base, crash_base + crash_size, crash_size, SECTION_SIZE); if (start != crash_base) { start = memblock_phys_alloc_range(crash_size, SECTION_SIZE, crash_base, crash_max); if (!start) { pr_err("crashkernel reservation failed - memory is in use...
found =memblock_find_in_range_node(size, align,0, max_addr, nid);if(found && !memblock_reserve(found, size))returnfound;return0; } 这里主要留意两个关键函数memblock_find_in_range_node()和memblock_reserve()。 先看一下memblock_find_in_range_node()的实现: 【file:/mm/memblock.c】/** *...
bootmem本身是个简单的,低级的内存分配器. 在引导程序的初期用来分配内存. 有人可能会想, 没有必要再增加一个内存分配器, 但是由于内存管理代码在被调用前需要很多内核功能都准备好, 要想在启动初期使用内存管理代码会大大增加内存管理的复杂性. 在x86架构上, 会首先使用early_res机制接替BIOS e820...
这里主要留意两个关键函数memblock_find_in_range_node()和memblock_reserve()。 先看一下memblock_find_in_range_node()的实现: 【file:/mm/memblock.c】 /** * memblock_find_in_range_node - find free area in given range and node * @size: size of free area to find ...
至此,空闲区域的查找基本就结束了,回到memblock_find_in_range_node函数中,再检查一下该区域的起始地址和结束地址是否合法等等,最终就申请到了所请求大小的内存区域,最后只需要将这块内存区域标记为reserved状态就结束了内存分配的整个过程了。 /*mm/memblock.c*/ ...
memblock_reserved memblock_alloc memblock_free 背景 在Linux内核开发过程中, 多少都会存在一个patch, 引入了远超预期的麻烦. 内核2.6.34开发过程中, 这个奖项非CONFIG_NO_BOOTMEM莫属 bootmem本身是个简单的,低级的内存分配器. 在引导程序的初期用来分配内存. 有人可能会想, 没有必要再增加一个内存分配器, 但是...
memblock_find_in_range_node查找符合条件的物理地址, 查找过程会涉及到查看memblock.reserve 如果找到了这个物理地址, 调用memblock_reserve进行真正的分配(就是在memblock.reserve中添加region) memblock_free 释放参数指定的内存区间 int __init_memblockmemblock_free(phys_addr_t base,phys_addr_t size){memblock_db...
ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT, max_pfn_mapped << PAGE_SHIFT, PAGE_SIZE * num , PAGE_SIZE);if(!ret) panic("alloc_low_page: can not alloc memory");memblock_reserve(ret, PAGE_SIZE * num); pfn = ret >> PAGE_SHIFT; ...