内存管理之bootmem管理之释放所有bootmem内存
2017-03-06 10:07
344 查看
主要是提供__free_pages_boot_core()函数,对外提供__free_pages_bootmem()和deferred_free_range()
__free_pages_bootmem()
1. free_bootmem_late
2. free_all_bootmem_core 《<-- free_all_bootmem》
3. __memblock_free_late
/* * free_bootmem_late - free bootmem pages directly to page allocator * @addr: starting physical address of the range * @size: size of the range in bytes * * This is only useful when the bootmem allocator has already been torn * down, but we are still initializing the system. Pages are given directly * to the page allocator, no bootmem metadata is updated because it is gone. */ void __init free_bootmem_late(unsigned long physaddr, unsigned long size) { unsigned long cursor, end; kmemleak_free_part_phys(physaddr, size); cursor = PFN_UP(physaddr); end = PFN_DOWN(physaddr + size); for (; cursor < end; cursor++) { __free_pages_bootmem(pfn_to_page(cursor), cursor, 0); totalram_pages++; } }
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) { struct page *page; unsigned long *map, start, end, pages, cur, count = 0; if (!bdata->node_bootmem_map) return 0; map = bdata->node_bootmem_map; start = bdata->node_min_pfn; end = bdata->node_low_pfn; bdebug("nid=%td start=%lx end=%lx\n", bdata - bootmem_node_data, start, end); while (start < end) { unsigned long idx, vec; unsigned shift; idx = start - bdata->node_min_pfn; shift = idx & (BITS_PER_LONG - 1); /* * vec holds at most BITS_PER_LONG map bits, * bit 0 corresponds to start. */ vec = ~map[idx / BITS_PER_LONG]; if (shift) { vec >>= shift; if (end - start >= BITS_PER_LONG) vec |= ~map[idx / BITS_PER_LONG + 1] << (BITS_PER_LONG - shift); } /* * If we have a properly aligned and fully unreserved * BITS_PER_LONG block of pages in front of us, free * it in one go. */ if (IS_ALIGNED(start, BITS_PER_LONG) && vec == ~0UL) { int order = ilog2(BITS_PER_LONG); __free_pages_bootmem(pfn_to_page(start), start, order); count += BITS_PER_LONG; start += BITS_PER_LONG; } else { cur = start; start = ALIGN(start + 1, BITS_PER_LONG); while (vec && cur != start) { if (vec & 1) { page = pfn_to_page(cur); __free_pages_bootmem(page, cur, 0); count++; } vec >>= 1; ++cur; } } } cur = bdata->node_min_pfn; page = virt_to_page(bdata->node_bootmem_map); pages = bdata->node_low_pfn - bdata->node_min_pfn; pages = bootmem_bootmap_pages(pages); count += pages; while (pages--) __free_pages_bootmem(page++, cur++, 0); bdata->node_bootmem_map = NULL; bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count); return count; }
相关文章推荐
- 内存管理之bootmem管理之标记内存为reserve
- 内存管理之bootmem管理之标记内存
- 请问如何强行释放所有已关闭的程序所残留的内存等资源?类似于微软的那个叫mem.exe的工具,如何入手呢?
- 内存管理之bootmem管理之__free_pages_boot_core
- oc-内存管理之自动释放--我自动释放了我使用的所有对象,但程序占用内存还是偏高,为什么?
- 内存管理之bootmem管理之free_all_bootmem
- 内存管理之bootmem管理之释放内存
- 内存管理之bootmem管理之对外分配函数
- linux 内核 内存管理 bootmem alloctor 申请内存
- C++内存管理变革(3):另类内存管理
- C++内存管理变革(3):另类内存管理
- Linux中的内存分配和释放之__alloc_boot函数分析
- linux 内存管理之bootmem allocator
- WinCE线程和内存管理之内存管理
- 内存的分配管理和释放
- WinCE线程和内存管理之内存管理
- System.GetMem、System.FreeMem - 申请和释放内存
- bootmem内存的分配
- C#中应用程序的垃圾回收器管理和内存的分配与释放
- 进程结束后,进程的所有内存都将被释放,包括堆上的内存泄露的内存。