|
ÇöÀçÀ§Ä¡ : ¸Þ´º¾ó> ¸®´ª½º ½Ã½ºÅÛ ÄÝ> mmap
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);
}
|
|
|