mm_init分析(Zoned Buddy Allocator)

來源:互聯網
上載者:User
 1 mm_init分析

file:init/main.c

start_kernel函數

{

 ...

 setup_arch(&command_line);

//處理器相關的初始化代碼,paging_init,詳細見bootmem_init分析
 mm_init_owner(&init_mm, &init_task);
 setup_command_line(command_line);
 setup_nr_cpu_ids();
 setup_per_cpu_areas();
 smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */

 build_all_zonelists(NULL);
 page_alloc_init();

 printk(KERN_NOTICE "Kernel command line: %s/n", boot_command_line);
 parse_early_param();
 parse_args("Booting kernel", static_command_line, __start___param,
     __stop___param - __start___param,
     &unknown_bootoption);
 pidhash_init();
 vfs_caches_init_early();
 sort_main_extable();
 trap_init();
 mm_init(); 

//當啟動初始化完後,node_bootmem_map會被釋放,系統初始化mem_map,

//利用struct page資料結構來管理所有的記憶體。

 ...

}

 

 

mem_init->free_all_bootmem_node->free_all_bootmem_core

 

//釋放node_bootmem_map,使用mem_map管理實體記憶體,以頁框為單位

static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
{
 int aligned;
 struct page *page;
 unsigned long start, end, pages, count = 0;

 if (!bdata->node_bootmem_map)
  return 0;

 start = bdata->node_min_pfn;
 end = bdata->node_low_pfn;

 /*
  * If the start is aligned to the machines wordsize, we might
  * be able to free pages in bulks of that order.
  */
 aligned = !(start & (BITS_PER_LONG - 1));

 bdebug("nid=%td start=%lx end=%lx aligned=%d/n",
  bdata - bootmem_node_data, start, end, aligned);

 while (start < end) {
  unsigned long *map, idx, vec;

  map = bdata->node_bootmem_map;
  idx = start - bdata->node_min_pfn;
  vec = ~map[idx / BITS_PER_LONG]; 

  //查詢改為是否為"0",當空閑時將page標誌為PG_Reserved

  if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) {
   int order = ilog2(BITS_PER_LONG);

   __free_pages_bootmem(pfn_to_page(start), order);
   count += BITS_PER_LONG;
  } else {
   unsigned long off = 0;

   while (vec && off < BITS_PER_LONG) {
    if (vec & 1) {
     page = pfn_to_page(start + off);
     __free_pages_bootmem(page, 0);
     count++;
    }
    vec >>= 1;
    off++;
   }
  }
  start += BITS_PER_LONG;
 }

 page = virt_to_page(bdata->node_bootmem_map);

 //得到node_bootmem_map的page地址
 pages = bdata->node_low_pfn - bdata->node_min_pfn;

 //得到實體記憶體的頁框數
 pages = bootmem_bootmap_pages(pages);

 //node_bootmem_map共佔了(
(pages/8)>>12 )頁
 count += pages;
 while (pages--)
  __free_pages_bootmem(page++, 0); //釋放node_bootmem_map佔用的頁框

 bdebug("nid=%td released=%lx/n", bdata - bootmem_node_data, count);

 return count;
}

 

 

Author:Woodpecker <Pecker.hu@gmail.com>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.