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 *start
와 size_t length
를 받으며, 이는 가상주소 start
부터 length
바이트로 이루어진 영역을 삭제하라는 말이다.
이후, 삭제된 영역으로의 참조는 세그먼트 오류를 발생시킨다.