Rechercher une page de manuel
mprotect
Langue: ja
Version: 2003-08-24 (openSuse - 09/10/07)
Section: 2 (Appels système)
̾Á°
mprotect - ¥á¥â¥êÎΰè¤Î¥¢¥¯¥»¥¹µö²Ä¤òÀ©¸æ¤¹¤ë½ñ¼°
#include <sys/mman.h> int mprotect(const void *addr, size_t len, int prot);
ÀâÌÀ
mprotect() ¤Ï¶è´Ö [addr,addr+len-1] ¤Î°ìÉô¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤ò´Þ¤à ¥á¥â¥ê¥Ú¡¼¥¸¤Î½ê˾¤Î¥¢¥¯¥»¥¹Êݸî¤ò»ØÄꤹ¤ë¡£ »ØÄꤷ¤¿¥¢¥¯¥»¥¹Êݸî¤Ç¶Ø»ß¤µ¤ì¤¿¥¢¥¯¥»¥¹¤ò¹Ô¤Ê¤¦¤È¡¢ ¥×¥í¥°¥é¥à¤Ï SIGSEGV ¤ò¼õ¿®¤¹¤ë¡£prot ¤Ï°Ê²¼¤ÎÃͤΥӥåȤ´¤È¤ÎÏÀÍýÏ (bitwize-or) ¤Ç¤¢¤ë:
- PROT_NONE
- ¤½¤Î¥á¥â¥ê¤Ë¤ÏÁ´¤¯¥¢¥¯¥»¥¹¤Ç¤¤Ê¤¤¡£
- PROT_READ
- ¤½¤Î¥á¥â¥ê¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤¤ë¡£
- PROT_WRITE
- ¤½¤Î¥á¥â¥ê¤Ë½ñ¤¹þ¤à¤³¤È¤¬¤Ç¤¤ë¡£
- PROT_EXEC
- ¤½¤Î¥á¥â¥ê¤Ë¼Â¹Ô¥³¡¼¥É¤ò´Þ¤à¤³¤È¤¬¤Ç¤¤ë¡£
¿·¤·¤¤¥¢¥¯¥»¥¹Êݸî¤Ï¤½¤ì¤Þ¤Ç¤Î¥¢¥¯¥»¥¹Êݸî¤òÃÖ¤´¹¤¨¤ë¡£ Î㤨¤Ð¡¢¤½¤ì¤Þ¤Ç PROT_READ ¤ÈÀßÄꤵ¤ì¤Æ¤¤¤ë¥á¥â¥êÎΰè¤ËÂФ·¤Æ¡¢ prot ¤ò PROT_WRITE ¤È¤·¤Æ mprotect() ¤ò¸Æ¤Ó½Ð¤¹¤È¡¢ ¤½¤ÎÎΰè¤Ï¤â¤Ï¤äÆɤ߼è¤ê²Äǽ¤Ç¤Ï¤Ê¤¯¤Ê¤ë¡£
ÊÖ¤êÃÍ
À®¸ù¤·¤¿¾ì¹ç¡¢ mprotect() ¤Ï 0 ¤òÊÖ¤¹¡£¥¨¥é¡¼¤Î¾ì¹ç¤Ï -1 ¤¬Ê֤ꡢ errno ¤¬Å¬ÀÚ¤ËÀßÄꤵ¤ì¤ë¡£¥¨¥é¡¼
- EACCES
- »ØÄꤵ¤ì¤¿¥¢¥¯¥»¥¹¤ò¥á¥â¥ê¤ËÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡£ ¤³¤ì¤Ï¡¢Î㤨¤Ð ¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤êÀìÍÑ¤Ç mmap(2) ¤·¤Æ¤ª¤ê¡¢¤½¤ÎÎΰè¤ËÂФ·¤Æ mprotect() ¤ò¸Æ¤Ó½Ð¤·¤Æ PROT_WRITE ¤ËÀßÄꤷ¤è¤¦¤È¤·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ë¡£
- EFAULT
- ¥á¥â¥ê¤¬¥¢¥¯¥»¥¹²Äǽ¤Ç¤Ê¤¤¡£
- EINVAL
- addr ¤¬Í¸ú¤Ê¥Ý¥¤¥ó¥¿¤Ç¤Ê¤¤¤«¡¢PAGESIZE ¤ÎÇÜ¿ô¤Ç¤Ê¤¤¡£
- ENOMEM
- ¥«¡¼¥Í¥ëÆâÉô¤Î¹½Â¤ÂΤò³ä¤êÅö¤Æ¤ë¤³¤È¤¬¤Ç¤¤Ê¤«¤Ã¤¿¡£ ¤â¤·¤¯¤Ï¡¢ [addr, addr+len] ¤È¤¤¤¦ÈϰϤΥ¢¥É¥ì¥¹¤¬¥×¥í¥»¥¹¤Î¥¢¥É¥ì¥¹¶õ´Ö¤È¤·¤ÆÉÔÀµ¤Ç¤¢¤ë¤«¡¢ ¤½¤ÎÈϰϤΥ¢¥É¥ì¥¹¤¬¥Þ¥Ã¥×¤µ¤ì¤Æ¤¤¤Ê¤¤ 1 ¤Ä°Ê¾å¤Î¥Ú¡¼¥¸¤ò»Ø¤·¤¿¡£
½àµò
SVr4, POSIX.1-2001. POSIX ¤Ç¤Ï¡¢ mprotect() ¤Ï mmap(2) ¤Ç³ÍÆÀ¤·¤¿¥á¥â¥êÎΰè¤ËÂФ·¤Æ¤Î¤ß»ÈÍѤǤ¤ë¤È¤·¤Æ¤¤¤ë¡£Ãí°Õ
Linux ¤Ç¤Ï¡¢(¥«¡¼¥Í¥ë vsyscall Îΰè°Ê³°¤Î) Ǥ°Õ¤Î¥×¥í¥»¥¹¥¢¥É¥ì¥¹¶õ´Ö¤Ë¤ª¤¤¤Æ mprotect() ¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¡¢¾ï¤Ëµö¤µ¤ì¤Æ¤¤¤ë¡£ ¤³¤ì¤ÏÆä˴û¸¤Î¥³¡¼¥É¥Þ¥Ã¥Ô¥ó¥°¤ò½ñ¤¹þ¤ß²Äǽ¤Ë¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¡£PROT_EXEC ¤¬ PROT_READ ¤È°Û¤Ê¤ë±Æ¶Á¤ò»ý¤Ä¤«Èݤ«¤Ï¡¢¥¢¡¼¥¥Æ¥¯¥Á¥ã¤È¥«¡¼¥Í¥ë¤Î¥Ð¡¼¥¸¥ç¥ó¤Ë°Í¸¤¹¤ë¡£
Îã
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/mman.h> #include <limits.h> /* PAGESIZE ¤ò»ÈÍѤ¹¤ë¤¿¤á */ #ifndef PAGESIZE #define PAGESIZE 4096 #endif int main(void) { char *p; char c; /* ¥Ð¥Ã¥Õ¥¡¤ò³ÎÊݤ¹¤ë¡£¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥¯¥»¥¹Êݸî PROT_READ|PROT_WRITE ¤Ë¤Ê¤ë¡£*/ p = malloc(1024+PAGESIZE-1); if (!p) { perror("Couldn't malloc(1024)"); exit(errno); } /* PAGESIZE ¤ÎÇÜ¿ô¤Ë¥¢¥é¥¤¥ó¥á¥ó¥È¤ò¤½¤í¤¨¤ë¡£ PAGESIZE ¤Ï 2 ¤ÎÎß¾è¤Ç¤¢¤ë¤È²¾Äꤹ¤ë¡£*/ p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1)); c = p[666]; /* Æɤ߼è¤ê; À®¸ù */ p[666] = 42; /* ½ñ¤¹þ¤ß; À®¸ù */ /* ¥Ð¥Ã¥Õ¥¡¤òÆɤ߼è¤êÀìÍѤËÀßÄꤹ¤ë¡£*/ if (mprotect(p, 1024, PROT_READ)) { perror("Couldn't mprotect"); exit(errno); } c = p[666]; /* Æɤ߼è¤ê; À®¸ù */ p[666] = 42; /* ½ñ¤¹þ¤ß; ¥×¥í¥°¥é¥à¤Ï SIGSEGV ¤Ç¶¯À©½ªÎ»¤¹¤ë */ exit(EXIT_SUCCESS); }
´ØÏ¢¹àÌÜ
mmap(2)Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre