GCC Wikia
Advertisement

このページを編集する際は,編集に関する方針に従ってください.[]

概要[]

引数[]

実装[]

 797 /* Allocate a new page for allocating small objects in ZONE, and
 798    return an entry for it.  */
799 
800 static struct small_page_entry *
801 alloc_small_page (struct alloc_zone *zone)
802 {
803   struct small_page_entry *entry;
804 

~
*使用していないページがあるか

 805   /* Check the list of free pages for one we can use.  */
806   entry = zone->free_pages;

~
*使用していないページがあったらそこを使用する

807   if (entry != NULL)
808     {
 809       /* Recycle the allocated memory from this page ...  */
810       zone->free_pages = entry->next;
811     }

~
*領域作成

812   else
813     {
 814       /* We want just one page.  Allocate a bunch of them and put the
 815          extras on the freelist.  (Can only do this optimization with
 816          mmap for backing store.)  */
817       struct small_page_entry *e, *f = zone->free_pages;
818       int i;
819       char *page;
820 

*メモリ領域の取得

821       page = alloc_anon (NULL, GGC_PAGE_SIZE * [[G>struct globals]].quire_size, zone);
822 

*取得した領域を切り分けていく(領域に細かくアクセスできるようにする)

 823       /* This loop counts down so that the chain will be in ascending
 824          memory order.  */
825       for (i = [[G>struct globals]].quire_size - 1; i >= 1; i--)
826         {
827           e = xcalloc (1, [[G>struct globals]].small_page_overhead);
828           e->common.page = page + (i << GGC_PAGE_SHIFT);
829           e->common.zone = zone;
830           e->next = f;
831           f = e;
832           set_page_table_entry (e->common.page, &e->common);
833         }
834 
835       zone->free_pages = f;
836 
837       entry = xcalloc (1, [[G>struct globals]].small_page_overhead);
838       entry->common.page = page;
839       entry->common.zone = zone;
840       set_page_table_entry (page, &entry->common);
841     }
842 
843   zone->n_small_pages++;
844 

~
*デバッグレベルによっては情報を出力する

845   if (GGC_DEBUG_LEVEL >= 2)
846     fprintf ([[G>struct globals]].debug_file,
847              "Allocating %s page at %p, data %p-%p\n",
848              entry->common.zone->name, (PTR) entry, entry->common.page,
849              entry->common.page + SMALL_PAGE_SIZE - 1);

~

850 
851   return entry;
852 }


リンク元

Advertisement