이 름
mprotect − 메 모 리 영 역 에 대 한 접 근 를 제 어 한 다 .
사 용 법
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
설 명
mprotect는 메 모 리 영 역 에 대 한 접 근 을 제 어 한 다 . 만 일 그 영 역 을 보 호 하 기 위 해 접 근 이 허 용 되 지 않 는 다 면 , 프 로 그 램 은 SIGSEGV를 받 는 다 .
prot는 다 음 값 들 의 비 트 OR이 다 :
PROT_NONE |
메 모 리 를 접 근 할 수 없 다 . |
|||
PROT_READ |
메 모 리 를 읽 을 수 있 다 . |
|||
PROT_WRITE |
메 모 리 를 쓸 수 있 다 . |
|||
PROT_EXEC |
메 모 리 에 실 행 코 드 를 둘 수 있 다 . |
새 로 설 정 한 보 호 모 드 는 기 존 의 보 호 모 드 를 대 체 한 다 . 예 를 들 어 , 이 전 에 메 모 리 가 PROT_READ로 표 시 되 어 있 는 데 , mprotect가 prot를 PROT_WRITE로 호 출 된 다 면 , 그 영 역 은 더 이 상 읽 기 전 용 이 아 니 다 .
반 환 값
성 공 시 , mprotect는 0을 리 턴 한 다 . 에 러 시 , −1이 리 턴 되 며 , errno는 적 당 한 값 으 로 설 정 된 다 .
에 러
EINVAL |
addr가 유 효 한 포 인 터 가 아 니 거 나 , 또 는 PAGESIZE의 배 수 가 아 니 다 . | ||
EFAULT |
메 모 리 를 접 근 할 수 없 다 . | ||
EACCES |
메 모 리 가 지 정 된 모 드 로 설 정 될 수 없 다 . 예 를 들 어 , 읽 기 전 용 접 근 을 하 도 록 파 일 을 mmap(2) 했 는 데 mprotect가 PROT_WRITE를 요 청 할 때 발 생 한 다 . | ||
ENOMEM |
내 부 커 널 구 조 체 를 할 당 할 수 없 다 . |
예 제
#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의 배 수 가 되 도 록 정 렬 ; 2의 제 곱 으 로 가 정 한 다 . */ |
p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1));
c = p[666]; /*
읽 기 ; ok */
p[666] = 42; /* 쓰 기 ; ok */
/* 버 퍼 를 읽 기 전 용 으 로 한 다 . */ |
if (mprotect(p, 1024,
PROT_READ)) {
perror("Couldn’t mprotect");
exit(errno);
}
c = p[666]; /*
읽 기 ; ok */
p[666] = 42; /* 쓰 기 ; 프 로
그 램 은 SIGSEGV로 죽 는
다 . */
exit(0);
}
호 환
SVr4, POSIX.1b (공 식 적 으 로 POSIX.4). SVr4는 EAGAIN 에 러 코 드 을 추 가 적 으 로 정 의 한 다 . SVr4 에 러 조 건 은 리 눅 스 와 정 확 히 대 응 되 지 는 않 는 다 . POSIX.1b에 서 는 mprotect는 mmap(2)으 로 확 보 한 메 모 리 영 역 에 서 만 사 용 될 수 있 다 고 말 한 다 .
관 련 항 목
역 자
정 강 훈 <skyeyes [AT] soback.net>, 2000년 5월 15일