mmap

ëªì¹
     mmap — ë©ëª¨ë¦¬ì í ë¹, ëë íì¼ ëë ëë°ì´ì¤ì ë©ëª¨ë¦¬ìì MAP

íë¡ê·¸ë¨ ë¼ì´ë¸ë¬ë¦¬
     Standard C Library (libc, -lc)

ìì
     <sys/types.h> <sys/mman.h> void * mmap(void *addr, size_t len, int prot,
     int flags, int fd, off_t offset)

í´ì¤
     mmap() í¨ìë, addr (ì)를 ìì ì¼ë¡ì ìµëë¡ len ë°ì´í¸ê° ì°ìíë íì´ì§ì, fd ì
     ìí´ ê¸°ì ëë ì¤ë¸ì í¸ì ë°ì´í¸ ì¤íì(offset) offset ì ìì¹ë¡ë¶í° ììëë ë¶ë¶ì
     MAP ëëë¡(ë¯ì´) í©ëë¤.  len íì§ë§ íì´ì§ ì¬ì´ì¦ì ë°°ìê° ìë ê²½ì°, MAP ë
     areaë ì§ì ì ë²ì를 ëì´ íì¥ë ì§ë 모ë¦ëë¤.  ì´ë¬í íì¥ì ìí´ MAP ë ì¤ë¸ì í¸ì
     ë§ë¨ì ëì ë¶ë¶ì 0 ì¼ë¡ 묻ì ì ììµëë¤.

     addr íì§ë§ 0 ì´ ìë ê²½ì°, ì´ê²ì ìì¤íìì íí¸ë¡ì ì¬ì©ë©ëë¤ (ìì¤íì í¸ì를
     ìí´ì(ë문ì), areaì ì¤ì ì 주ìë ì§ì ë 주ììë ë¤ë¥¼ ê°ë¥ì±ì´ ììµëë¤).  addr
     íì§ë§ 0 ì ê²½ì°, 주ìë ìì¤íì ìí´ ì íë©ëë¤.  areaì ì¤ì ì ê°ì 주ìê°
     ëë ¤ì£¼ì´ì§ëë¤.  mmap íì§ë§ ì²ë¦¬ì ì±ê³µíë©´(ì), íë³´ë 주ì ë²ìì ì´ì ì
     매íì ìì ë©ëë¤.

     ë³´í¸ (areaìì ì¡ì¸ì¤ íê°)ë prot ì¸ìë¡, ì´íì ê°ì ë¼ë¦¬í© (or) (ì)를 ì·¨í
     ê°ì¼ë¡ ì§ì í©ëë¤.

     PROT_NONE   íì´ì§ë ì¡ì¸ì¤ í  ì ììµëë¤.
     PROT_READ   íì´ì§ë ì½ê¸° í  ì ììµëë¤.
     PROT_WRITE  íì´ì§ë ê¸°ë¡ í  ì ììµëë¤.
     PROT_EXEC   íì´ì§ë ì¤í ê°ë¥í©ëë¤.

     flags íë¼ë¯¸í°ë, MAP ë ì¤ë¸ì í¸ì íì, 매í ìµì, ë° MAP ë íì´ì§ì ì¹´í¼ì
     ëí´ì íí´ì§ ìì ì´, íë¡ì¸ì¤ì ê³ ì íê° ëë ì¸ë¡ë¶í°ì 참조ì ê³µì ëëì§ë¥¼
     ì§ì í©ëë¤.  ê³µì , 매í íì, ë° ìµìì, ì´íì ê°ì ë¼ë¦¬í© (or) (ì)를 ì·¨í
     ê°ì¼ë¡ flags ì¸ìë¡ ì§ì í©ëë¤.

     MAP_ANON          ì´ë í¹ì ì íì¼ê³¼ë ëìíê³  ìì§ ìë ìµëª ë©ëª¨ë¦¬ë¥¼ MAP
                       í©ëë¤.  MAP_ANON (ì)를 ìì±íëë° ì¬ì©ëë¤ íì¼ ê¸°ì ìë -1
                       ì¼ íìê° ììµëë¤.  offset íë¼ë¯¸í°ë 무ìë©ëë¤.

     MAP_FIXED         ìì¤íì´, ì§ì ë 주ìì ë¤ë¥¸ 주ì를 ì ííë ê²ì íì© íì§
                       ììµëë¤.  ì§ì ë 주ì를 ì¬ì©í  ì ìë ê²½ì°, mmap() (ì)ë
                       ì²ë¦¬ì ì¤í¨í©ëë¤.  MAP_FIXED íì§ë§ ì§ì ëì´ ìë ê²½ì°,
                       addr (ì)ë íì´ì§ ì¬ì´ì¦ì ë°°ìì¼ íìê° ììµëë¤.  ì´ ìµìì
                       ì¬ì©ì ì¶ì²í  ì ììµëë¤.

     MAP_HASSEMAPHORE  areaì semaphoreê° í¬í¨ëì´ ìì ê°ë¥ì±ì´ ìë ê², í¹ìí
                       ì²ë¦¬ê° íìí ê°ë¥ì±ì´ ìë ê²ì 커ëì íµì§í©ëë¤.

     MAP_NOCORE        areaë ì½ì´ íì¼ì í¬í¨ëì§ ììµëë¤.

     MAP_NOSYNC        (ì)ë ì´ VM MAP를 ê²½ì í´ ëë½íì§ ë°ì´í°ë¥¼, í¨ë¶ë¡ë
                       ìëê³  (íµìì íì´ìì ìí´) íìí ëë§ ë¬¼ë¦¬ì ì¸ ë¯¸ëì´ì íëì
                       íëë¡(ë¯ì´) í©ëë¤.  ë³´íµ, ì´ ìµìì ìí´, ê°±ì  demonë ì´
                       MAPë¡ ëë½íì§ íì´ì§ë¥¼ íëì íì§ ìê² ë©ëë¤. ì´ê²ì ìí´, íì¼
                       ë°±ì ë ê³µì  ë©ëª¨ë¦¬ì 매íì ì¬ì©í´ 무ê´ê³í íë¡ì¸ì¤ì
                       ì¬ì´ì ë©ëª¨ë¦¬ìí¬ì¸ì¤ë¥¼ í¨ì¨ì ì¼ë¡ ê³µì íë ê²ì´ í  ì
                       ìê² ë©ëë¤.  ì´ ìµìì´ ìì¼ë©´ ëë½íì§ VM íì´ì§ë ë²ë¯¼ (íµì
                       30-60 ì´ ë§ë¤)ì ëì¤í¬ì íëì ë ì§ë ëª¨ë¥´ì§ ìê³ , ê·¸ë¬í
                       ëìì íìë¡ íì§ ìë ê²½ì° (ì를 ë¤ë©´ IPC 를 ìí´ì(ë문ì)
                       íì¼ì ì´ì©í ê³µì  mmap area를 ì´ì©íê³  ìë ê²½ì°)
                       í¼í¬ë¨¼ì¤ì 문ì ê° ëì¤ë ì¼ì´ ììµëë¤.  MAP_NOSYNC (ì)를
                       ì¬ì©íê³  ììê¹ì ê´ê³ìì´, VM/ íì¼ ìì¤íì ì¼ê´ì±ì ì ì§ëë
                       ê²ì 주ìí´ ì£¼ì¸ì.  ì´ ìµìì UNIX íë«í¼ê°ì ( ìì§) ì´ìì±ì
                       ììµëë¤ë§, ëªê°ì íë«í¼ììë ëí´í¸ë¡ ê°ì ëìì íëë¡(ë¯ì´)
                       ì¤ì¥ëê³  ììì§ë 모ë¦ëë¤.

                       ê²½ê³ !  ftruncate(2) (ì)를 ì¬ì© íì¼ì íì¥íê³  ëì, ì¦
                       íì¼ì í° êµ¬ë©ì ë«ê³  ëì, ê·¸ 구ë©ì ê³µì  mmap() (ì)를
                       ìì í´ ë¬»ë ê²½ì°, ì¬ê°í íì¼ ë¨í¸íê° ì길 ê°ë¥ì±ì´
                       ììµëë¤.  ì´ ë¨í¸í를 í¼í기 ìí´ì(ë문ì), mmap()
                       ê·¸ë¦¬ê³  ê·¸ area를 ìì í기 ì ì, ì ê·ì íì¥í areaì 0 ì
                       write() í´, íì¼ì ë°°í¹ ì¤í ì´ë¥¼ ì¬ì ì í ë¹í´ ë íìê°
                       ììµëë¤.  ëì¤í¬ìì íëìê° ìì í ëë¤ì ì기기 (ìí´)ë문ì,
                       ë¨í¸í 문ì ì í¹í 민ê°í ê²ì, MAP_NOSYNC íì´ì§ìëë¤.

                       ê°ì ê²ì´, MAP_NOSYNC (ì)를 ì¬ì© íì¼ ë² ì´ì¤ì ê³µì
                       ë©ëª¨ restore를 ì¤ì¥íë ê²½ì°ìë ë§í  ì ììµëë¤.
                       ftruncate() í´ ë°°í¹ ì¤í ì´ë¥¼ ë§ëë ê²ì´ ìëë¼, 0 ì
                       write() í´ ë°°í¹ ì¤í ì´ë¥¼ ë§ëë ê²ì ì¶ì² í©ëë¤.  ì를
                       ë¤ì´, “dd if=filename of=/dev/null bs=32k” (ì)를
                       ì¬ì©íë ë± í´ ê±°ëí íì¼ì ìíìì ì½ì´ë¤ì´ë©´ì, “iostat 1”
                       (ì)를 í¸ì¶íë ê²ì¼ë¡ ì»ì ì ìë¤ KB/t (ì ì¡ 1 í 쯤ì
                       í¬ë¡ë°ì´í¸ì)를 ê´ì°°íë ê²ì¼ë¡ íì¼ ë¨í¸íì íì¤í¸ê°
                       ê°ë¥í©ëë¤.

                       fsync(2) í¨ìë ëª¨ë  ì¤ì¼ë ë°ì´í°ì íì¼ì ê´ë ¨ ì§ì ì ììë
                       ë©íë°ì´í (NOSYNC ê° ëë¬ìì§ VM ë°ì´í°ë¥¼ í¬í¨íë¤)(ì)를
                       ë¬¼ë¦¬ì  ë§¤ì²´ì íëì í©ëë¤.  sync(8) ëªë ¹ì sync(2)
                       ìì¤í ì½ì, ì¤ì¼ë NOSYNC VM ì ë°ì´í°ë¥¼ íµì íëì íì§
                       ììµëë¤.  msync(2) ìì¤í ì½ì BSD ê·¸ë¦¬ê³  ì í©ì±ì´ ìë
                       íì¼ ìì¤íì ë²í¼ ìºì¬ê° ì¤ì¥ëìì¼ë¯ë¡ íì§ëììµëë¤.
                       ê·¸ë ì§ë§, ëë¬ìì§ VM íì´ì§ì íì¼ ìì¤íì ë¬¶ì´ ë¬¼ë¦¬ì
                       매체ì 곧ë°ë¡(ëì¤ìë ìëê³ ) íëì ìí¤ë ì©ëì ì¬ì©ëë ì¼ë
                       ììµëë¤.

     MAP_PRIVATE       ìì ì íë¡ì¸ì¤ ê³ ì íê² íí´ì§ëë¤.

     MAP_SHARED        ìì ì ê³µì ë©ëë¤.

     MAP_STACK         ì´ ìµìì ì´ì©í  ì ìë ê²ì, ìì¤íì 커ëì ì»´íì¼ í  ê²½ì°ì
                       VM_STACK (ì)를 ì ìí´ ì»´íì¼ íì ê²½ì°ë§ìëë¤.  ì´ê²ì
                       i386 ì ê´í´ìë§ ëí´í¸ìëë¤. ë¤ë¥¸ ìí¤íì³ë¡ ì´ ìµìì
                       ì í¨íê² íê³  ì¶ì ê²½ì°ë, /etc/make.conf ììì -DVM_STACK
                       (ì)를 COPTFLAGS ì ì¶ê°íë ë°©ë²ì ê²í í´ ì£¼ì¸ì.
                       MAP_STACK í MAP_ANON ë° 0 ì offset ì§ì ì í¬í¨í©ëë¤.  fd
                       (ì)ë -1 ëì¤ì§ ìì¼ë©´ ìëì´, prot ìë ì ì´ë PROT_READ
                       (ì)ê³¼ PROT_WRITE íì§ë§ ë¤ì´ê° ìì íìê° ììµëë¤.  ì´
                       ìµìì, ì¤íì ì ë를 ê°ìì ì¼ë¡ í´ íë¶ì ì±ì¥íë, ì¬ì´ì¦ê°
                       ìµëë¡ len ë°ì´í¸ê¹ì§ ì±ì¥íë ë©ëª¨ë¦¬ area를 ìì±í©ëë¤.
                       ì¤íì ì ëë, í¸ì¶ë¡ë¶í° ëë ¤ì£¼ì´ì§ ê°ì 주ìì len
                       ë°ì´í¸ë¥¼ ëí ê²ì´ ë©ëë¤. ê°ì¥ ì±ì¥íì ê²½ì°ì ì¤íì íë¨ì,
                       í¸ì¶ì ìí´ ëë ¤ì£¼ì´ì§ë ê°ì 주ìê° ë©ëë¤.

     close(2) í¨ìë íì´ì§ë¥¼ ì MAP íì§ ììµëë¤. ìì¸í ê²ì ëíì¬ë munmap(2) (ì)를
     ì°¸ì¡°í´ ì£¼ì¸ì.

     íì¬ì ì¤ê³ììë íë¡ì¸ì¤ë ì¤ì ê³µê°ì ìì¹ë¥¼ ì§ì í  ì ììµëë¤.  ì¥ëë, ì¶ê°ì
     매í íì MAP_SWAP (ì)를 ì ìí ì§ë 모ë¦ëë¤. ì´ ê²½ì°, íì¼ ê¸°ì ì ì¸ììë
     ì¤ìì íí´ì¼ í  íì¼ ëë ëë°ì´ì¤ë¥¼ ì§ì í©ëë¤.

ë°íê°
     ì ìì ì¼ë¡ ìë£íë©´(ì), mmap() (ì)ë, MAP ë area를 ê°ë¦¬í¤ë í¬ì¸í°ë¥¼
     ëë ¤ì¤ëë¤. ê·¸ë ì§ ìì ê²½ì°ë ì¹ MAP_FAILED íì§ë§ ëë ¤ì£¼ì´ì ¸ ìë¬ë¥¼
     ëíë´ê¸° ìí´ì(ë문ì) errno íì§ë§ ì¤ì ë©ëë¤.

ìë¬
     mmap() (ì)ë ë¤ìì ê²½ì°ì ì¤í¨í©ëë¤.

     [EACCES]           íëê·¸ PROT_READ íì§ë§ prot íë¼ë¯¸í°ì ì¼ë¶ë¡ì
                        ì§ì ëììµëë¤ë§, fd íì§ë§ ì½ê¸°ì©ì¼ë¡ ì´ë¦¬ê³  ìì§
                        ìììµëë¤.  íëê·¸ MAP_SHARED (ì)ê³¼ PROT_WRITE íì§ë§
                        flags (ì)ê³¼ prot íë¼ë¯¸í°ì ì¼ë¶ë¡ì ì§ì ëììµëë¤ë§, fd
                        (ì)ë 기ë¡ì©ì¼ë¡ ì´ë¦¬ê³  ìì§ ìììµëë¤.

     [EBADF]            fd íì§ë§ ì í¨í ì´ë¦° íì¼ì 기ì ìê° ìëëë¤.

     [EINVAL]           MAP_FIXED íì§ë§ ì§ì ëì´ addr íë¼ë¯¸í°ê° íì´ì§ ê²½ê³ì
                        ì ë ¬ëì´ ìì§ ììì§, ëë ì§ì ì 주ìì ì¼ë¶ê° ì ì  íë¡ì¸ì¤ì
                        ì í¨í address ê³µê°ì ë°ì´ ë©ëë¤.

     [EINVAL]           len íì§ë§ ë¶ììµëë¤.

     [EINVAL]           MAP_ANON íì§ë§ ì§ì ëì´ fd íë¼ë¯¸í°ê° -1 ê° ìëììµëë¤.

     [EINVAL]           MAP_ANON íì§ë§ ì§ì ëì§ ìê³ , fd íì§ë§ íµìì íì¼ ëë
                        ìºë¦í°í í¹ì íì¼ì 참조íê³  ììììµëë¤.

     [EINVAL]           offset íì§ë§ íì´ì§ ê²½ê³ì ì ë ¬íê³  ììììµëë¤ (íì  íë ã
                        ë²ê·¸ ì ì¥ãì 참조).

     [ENOMEM]           MAP_FIXED íì§ë§ ì§ì ëì´ ììµëë¤ë§, addr íë¼ë¯¸í°ê°
                        주ì´ì§ê³  ìì§ ììµëë¤.  MAP_ANON íì§ë§ ì§ì ëì´ ì´ì©í
                        ì ìë ë©ëª¨ë¦¬ê° ë¶ì¶©ë¶íìµëë¤.  sysctl ì¹
                        vm.nax_proc_mmap ê·¸ë¦¬ê³  ì§ì ëìë¤ íë¡ì¸ì¤ ë§ë¤ì mmap
                        íê³ì ì´ë¥´ë ìµëë¤.

ê´ë ¨ í목
     madvise(2), mincore(2), mlock(2), mprotect(2), msync(2), munlock(2),
     munmap(2), getpagesize(3)

ë²ê·¸
     len (ì)ë 2GB ë¡ íì ë©ëë¤. 2GB 를 ì¡°ê¸ ìëë 매íì 기ë¥í©ëë¤ë§, 2GB, 4GB,
     6GB, ë° 8GB ë³´ë¤ ì¡°ê¸ ì ì íì¼ ì¬ì´ì¦ì ëí´ (íì¼ ì¬ì´ì¦ % 2GB)ì ì¬ì´ì¦ì
     ìëì°ë¥¼ MAP í  ì ììµëë¤.

     ì ì½ì ë¤ì±ë¡ì´ ì´ì ë¡ë¶í° ìê¸°ê³  ììµëë¤.  ê·¸ ëë¶ë¶ì, í¼í¬ë¨¼ì¤ìì íì í
     í¨ëí°ì´ê¸° ë문ì, FreeBSD ê·¸ë¼ VM ìì¤íë´ìì 64 ë¹í¸ì ì¤íì(offset)를
     ì¬ì©íê³  ì¶ì§ ìì ê²ê³¼ ê´ê³íê³  ììµëë¤.  ë°ë¼ì FreeBSD (ì)ë 32 ë¹í¸ì
     íì´ì§ ì¸ë±ì¤ë¥¼ ì¬ì©íê³  ìì´, ì´ê²ì ìí´ FreeBSD ê·¸ë¼ ìµê³ ë¡ 8TB ê¹ì§ì
     íì¼ ì¬ì´ì¦ë¥¼ ì´ì©í  ì ììµëë¤. ì¤ì ë¡ë í층 ë ì ì½ì´ ë¶ê³¼ëì´ ì¬ì© ê°ë¥
     ì¬ì´ì¦ë 1TB ê¹ì§ìëë¤ë§, ì´ê²ì, íì¼ ìì¤í ì½ëë´ì ë²ê·¸ì ìíë ê²ìëë¤ (ë¸ë¡
     ë²í¸ ê³ì°ì ííê³  ìì ëì ì리ì ë¹ ì§).

     2GB ì íì ë íëì ì´ì ë, íì´ë¥´ìì¤íë©íë°ì´íê° ë¶ì ì¤íì(offset)ì ì¡´ì¬í  ì
     ìë¤ê³  íë ê²ìëë¤.