포스트

MMAP & MUNMAP

mmap()함수와 munmap()함수는 가상 메모리의 영역들을 생성하고 삭제할 수 있게 해주는 함수들이다.

MMAP

mmap()함수는 Memory Map이라는 뜻을 가지며, 말 그대로 메모리를 매핑하여 가상 메모리의 영역을 생성하고 삭제할 수 있게 해준다. 커널에 새 가상메모리 영역을 생성해 줄 것을 요청하며, 객체들을 이 영역으로 매핑할 수 있다.

이를 사용해 성공적으로 파일을 메모리에 매핑한다면, 해당 메모리의 주소값이 반환된다.
mmap()함수는 다음의 6 인자들을 받는다.
void *address, size_t length, int protect, int flags, int filedes, off_t offset

address

이 인자는 매핑에 선호하는 시작 주소를 함수로 전달하며, 대개 NULL로 명시한다.
다른 매핑이 해당 주소에 존재하지 않다면 커널은 근처의 페이지 영역을 선택하여 매핑을 한다. 해당 인자에 NULL이 패스된다면 커널은 적절한 위치를 찾아 매핑을 한다.

length

매핑 될 바이트의 수이다.

protect

이 인자는 어떤 접근이 허용되는지 제어하기 위해 사용된다.
파일에 대응되는 메모리 영역의 보호 특성을 결정하기 위해 다음의 비트들이 있으며, 해당 비트들의 논리 OR 형태로도 사용 가능하다.

PROT_EXEC : 실행 가능한 페이지
PROT_READ : 읽기 가능한 페이지
PROT_WRITE : 쓰기 가능한 페이지
PROT_NONE : 접근 불가능한 페이지

flags

매핑의 유형과 동작 구성 요소를 결정하는 값이다. 이는 대응되는 페이지 복사본에 대한 수정이 해당 프로세스에서만 보일 것인지, 아니면 다른 참조하는 프로세스와 공유할 것인지를 설정한다.

MAP_SHARED : 이 플래그는 매핑을 다른 모든 프로세스들과 공유하기 위해 사용된다. 매핑된 영역에 대한 수정은 파일에 다시 쓰여진다.
MAP_PRIVATE : 해당 플래그가 사용되면 매핑은 다른 프로세스들에게 보이지 않으며, 변경점들 또한 파일에 쓰여지지 않는다.
MAP_ANONYMOUS || MAP_ANON : 익명의 매핑을 만들며, 파일 디스크립터로 인식하지 않는다. 어떠한 파일에도 연결되지 않으며, 힙을 늘리는 방식으로 사용된다.
MAP_FIXED : 지정된 주소 이외의 다른 주소를 선택하지 않는다. 이 때, 지정된 주소가 사용될 수 없다면 mmap()은 실패한다.

filedes

매핑될 파일 디스크립터이다.

offset

매핑할 때, 옮길 데이터의 시작점을 지정하는 인수이다.

MUNMAP

munmap()함수는 가상메모리의 영역들을 삭제한다.

인수로는 void *startsize_t length를 받으며, 이는 가상주소 start부터 length바이트로 이루어진 영역을 삭제하라는 말이다.
이후, 삭제된 영역으로의 참조는 세그먼트 오류를 발생시킨다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.