linux man page : mmap - ÆÄÀÏÀ̳ª ÀåÄ¡¸¦ ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù.
ÃÑ ÆäÀÌÁö ¼ö : 3121

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¸Þ´º¾ó>¸®´ª½º ½Ã½ºÅÛ ÄÝ>mmap


<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=mmap">mmap</a>(2)

1장. mmap(2)

ÆÄÀÏÀ̳ª ÀåÄ¡¸¦ ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŰ°Å³ª Ǭ´Ù.


1.1. »ç¿ë¹ý

#include <unistd.h>
#include <sys/mman.h>

#ifdef _POSIX_MAPPED_FILES
void * mmap(void *start, size_t length, int prot, int
        flags, int fd, off_t offset);
int munmap(void *start, size_t length);

#endif
		


1.2. ¼³¸í

mmap() ÇÔ¼ö´Â fd·Î ÁöÁ¤µÈ ÆÄÀÏ(ȤÀº ´Ù¸¥ °´Ã¼)¿¡¼­ offsetÀ» ½ÃÀÛÀ¸·Î length¹ÙÀÌÆ® ¸¸Å­À» startÁÖ¼Ò·Î ´ëÀÀ½Ã۵µ·Ï ÇÑ´Ù. startÁÖ¼Ò´Â ´ÜÁö ±× ÁÖ¼Ò¸¦ »ç¿ëÇßÀ¸¸é ÁÁ°Ú´Ù´Â Á¤µµ·Î º¸Åë 0À» ÁöÁ¤ÇÑ´Ù. mmap´Â ÁöÁ¤µÈ ¿µ¿ªÀÌ ´ëÀÀµÈ ½ÇÁ¦ ½ÃÀÛÀ§Ä¡¸¦ ¹ÝȯÇÑ´Ù. protÀÎÀÚ´Â ¿øÇÏ´Â ¸Þ¸ð¸® º¸È£¸ðµå¸¦ ¼³Á¤ÇÑ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â ºñÆ®´Â ´ÙÀ½°ú °°´Ù.

PROT_EXEC

ÆäÀÌÁö´Â ½ÇÇà°¡´ÉÇÏ´Ù.

PROT_READ

ÆäÀÌÁö´Â ÀÐÀ» ¼ö ÀÖ´Ù.

PROT_WRITE

ÆäÀÌÁö´Â ¾²¿©Áú ¼ö ÀÖ´Ù.

PROT_NONE

ÆäÀÌÁö´Â Á¢±ÙÇÒ ¼ö ¾ø´Ù.

flags´Â ´ëÀÀµÈ °´Ã¼ÀÇ Å¸ÀÔ, ´ëÀÀ ¿É¼Ç, ´ëÀÀµÈ ÆäÀÌÁö º¹»çº»¿¡ ´ëÇÑ ¼öÁ¤ÀÌ ±× ÇÁ·Î¼¼½º¿¡¼­¸¸ º¸ÀÏ °ÍÀÎÁö ¾Æ´Ï¸é, ´Ù¸¥ ÂüÁ¶ÇÏ´Â ÇÁ·Î¼¼½º¿Í °øÀ¯ÇÒ °ÍÀÎÁö¸¦ ¼³Á¤ÇÑ´Ù. ´ÙÀ½°ú °°Àº ºñÆ®µéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

MAP_FIXED

ÁöÁ¤µÈ ÁÖ¼Ò ÀÌ¿ÜÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ ¼±ÅÃÇÏÁö ¾Ê´Â´Ù. ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÉ ¼ö ¾ø´Ù¸é mmap()´Â ½ÇÆÐÇÑ´Ù. ¸¸ÀÏ MAP_FIXED°¡ ÁöÁ¤µÇ¸é, start´Â ÆäÀÌÁö Å©±âÀÇ ¹è¼öÀ̾î¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇÀº »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.

MAP_FIXED

ÁöÁ¤µÈ ÁÖ¼Ò ÀÌ¿ÜÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ ¼±ÅÃÇÏÁö ¾Ê´Â´Ù. ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÉ ¼ö ¾ø´Ù¸é mmap()´Â ½ÇÆÐÇÑ´Ù. ¸¸ÀÏ MAP_FIXED°¡ ÁöÁ¤µÇ¸é, start´Â ÆäÀÌÁö Å©±âÀÇ ¹è¼öÀ̾î¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇÀº »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.

MAP_SHARED

´ëÀÀµÈ °´Ã¼¸¦ ´Ù¸¥ ¸ðµç ÇÁ·Î¼¼½º¿Í °øÀ¯ÇÑ´Ù.

MAP_PRIVATE

°³º°ÀûÀÎ copy-on-write ´ëÀÀÀ» ¸¸µç´Ù.(´Ù¸¥ ÇÁ·Î¼¼½º¿Í ´ëÀÀ ¿µ¿ªÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù).

À§ÀÇ 3°³ÀÇ Ç÷¡±×´Â POSIX.1b¿¡ ±ÔÁ¤µÇ¾î ÀÖ´Ù. ¸®´ª½º´Â MAP_DENYWRITE, MAP_EXECUTABLE, MAP_ANON(YMOUS)µµ Áö¿øÇÑ´Ù.

munmap() ´Â ÁöÁ¤µÈ ÁÖ¼Ò °ø°£¿¡ ´ëÇÑ ´ëÀÀÀ» Ǭ´Ù. ¹üÀ§³»ÀÇ ÁÖ¼Ò¿¡ ´ëÇÑ ÂüÁ¶ °è¼ö¸¦ ´Ã·Á¼­ À¯È¿ÇÏÁö ¾ÊÀº ¸Þ¸ð¸® ÂüÁ¶·Î ¸¸µç´Ù.


1.3. ¹Ýȯ°ª

¼º°ø½Ã, mmap()´Â ³»ÀÀµÈ ¿µ¿ªÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. ¿¡·¯½Ã¿¡´Â -1(MAP_FAILED)ÀÌ ¸®ÅϵǸç, errno´Â Àû´çÇÑ °ªÀ¸·Î ¼³Á¤µÈ´Ù. munmap()´Â 0À» ¸®ÅÏÇϸç, ½ÇÆÐ½Ã -1ÀÌ ¸®ÅϵǸç, errno°¡ ¼³Á¤µÈ´Ù.


1.4. ¿¡·¯

EBADF

fd°¡ À¯È¿ÇÑ ÆÄÀÏ ±â¼úÀÚ°¡ ¾Æ´Ï´Ù.

EACCES

MAP_PRIVATE°¡ ¼³Á¤µÇ¾î ÀÖÁö¸¸ fd°¡ ÀÐÀ» ¼ö ÀÖµµ·Ï ¿­·Á ÀÖÁö ¾Ê´Ù. ¶Ç´Â MAP_SHARED¿Í RPOT_WRITE°¡ ¼³Á¤µÇ¾î ÀÖÁö¸¸ fd°¡ ¾µ ¼ö ÀÖµµ·Ï ¿­·ÁÀÖÁö ¾Ê´Ù.

EINVAL

start³ª length³ª offsetÀÌ Àû´çÇÏÁö ¾Ê´Ù. º¸Åë ³Ê¹« Å©°Å³ª PAGESIZE °æ°è·Î Á¤·ÄµÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì.

ETXTBUSY

MAP_DENYWRITE°¡ ¼³Á¤µÇ¾î ÀÖÀ¸³ª fd·Î ÁöÁ¤µÈ °´Ã¼°¡ ¾²±â À§ÇØ ¿­·ÁÀÖ´Ù.

EAGAIN

ÆÄÀÏÀÌ Àá°Ü ÀÖ´Ù.

ENOMEM

»ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®°¡ ¾ø´Ù.


1.5. ¿¹Á¦

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    int fd;
    char *file = NULL;
    struct stat sb;
    char buf[80] ={0x00,};
    int flag = PROT_WRITE | PROT_READ;

    if (argc < 2)
    {
        fprintf(stderr, "Usage: input\n");
        exit(1);
    }

    if ((fd = open(argv[1], O_RDWR|O_CREAT)) < 0)
    {
        perror("File Open Error");
        exit(1);
    }

    if (fstat(fd, &sb) < 0)
    {
        perror("fstat error");
        exit(1);
    }

    file = (char *)malloc(40);

    // mmap¸¦ ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù.
    // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À»
    // ÇÏ¸é µÈ´Ù.
    if ((file =
        (char *) mmap(0, 40, flag, MAP_SHARED, fd, 0)) == -1)
    {
        perror("mmap error");
        exit(1);
    }
    printf("%s\n", file);
    memset(file, 0x00, 40);
    mnumap(file);
    close(fd);
}