GCC Wikia
Advertisement

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

概要[]

引数[]

実装[]

762 #ifdef USING_MMAP
763 /* Allocate SIZE bytes of anonymous memory, preferably near PREF,
764    (if non-null).  The ifdef structure here is intended to cause a
765    compile error unless exactly one of the HAVE_* is defined.  */
766 
767 static inline char *
768 alloc_anon (char *pref ATTRIBUTE_UNUSED, size_t size, struct alloc_zone *zone)
769 {


  • メモリを割り当てる
    • MAP_ANONYMOUSを指定すると後ろの2つの引数(fd, offset)は無視し、どのファイルとも関連付けされない

770 #ifdef HAVE_MMAP_ANON
771   char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
772                               MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
773 #endif
774 #ifdef HAVE_MMAP_DEV_ZERO
775   char *page = (char *) mmap (pref, size, PROT_READ | PROT_WRITE,
776                               MAP_PRIVATE, [[G>struct globals]].dev_zero_fd, 0);
777 #endif
778


  • エラーチェック
    • メモリが割り当てられたか

779   if (page == (char *) MAP_FAILED)
780     {
781       perror ("virtual memory exhausted");
782       exit (FATAL_EXIT_CODE);
783     }
784 


  • マップしているバイト数を記録

785   /* Remember that we allocated this memory.  */
786   zone->bytes_mapped += size;
787 

  • valgrindを使用してメモリを操作する


  • 割り当てられたページにアクセスしないと偽ってください。ggc_allocで領域のより小さな部分へのアクセスを可能にします。ハンドルリークを避けるために、ハンドルを捨ててください。

788   /* Pretend we don't have access to the allocated pages.  We'll enable
789      access to smaller pieces of the area in ggc_alloc.  Discard the
790      handle to avoid handle leak.  */
791   VALGRIND_DISCARD (VALGRIND_MAKE_NOACCESS (page, size));
792 


793   return page;
794 }
795 #endif



リンク元

Advertisement