mprotect

Autres langues

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)