한국어
Linux Programming

mmap() 함수, munmap() 함수

pjk 2014.02.05 15:38 조회 수 : 4930 추천:1

mmap() 함수
 기능 파일이나 디바이스를 응용 프로그램의 주소 공간 메모리에 대응시킨다.
 형태
 #include <unistd.h>
 #include <sys/mman.h>
 
 void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);


 설명
 mmap() 함수는 fd로 지정된 디바이스 파일에서 offset에 해당하는 물리 주소에서 시작하여 length 바이트 만큼을 start 주소로 대응시킨다. start 주소는 보통 0으로 지정하고, 강제적인 요구가 아니기 때문에 다른 값을 지정해도 꼭 그 값으로 매핑시켜 반환되지는 않는다. offset과 length는 PAGE_SIZE 단위여야 한다. mmap은 지정된 영역에 대응되는 응용 프로그램에서 사용 가능한 실제 시작 위치를 반환한다. 성공하면 mmap은 대응된 영역의 포인터를 반환한다. 에러가 발생하면 MAP_FAILED(-1)이 반환되며, errno는 적당한 값으로 설정된다.
 

매개변수
start: 요청한 물리 주소 공간을 매핑하고자 하는 주소로, 보통은 0을 사용한다.
length: 매핑하고자 하는 주소 공간의 크기로, PAGE_SIZE의 배수여야한다.
prot: 메모리 보호 모드를 설정한다.
   - PROT_EXEC: 페이지가 실행될 수 있다.
   - PROT_READ: 페이지를 읽을 수 있다.
   - PROT_WRITE: 페이지에 쓸 수 있다.
   - PROT_NONE: 페이지에 접근할 수 없다.
flags: 대응된 객체 타입, 대응 옵션, 대응된 페이지 복사본에 대한 수정을 그 프로세스에만 보일 것인지 참조하는 다른 프로세스와 공유할 것인
지를 설정한다. MAP_SHARED나 MAP_PRIVATE 중 하나는 반드시 명시해야 한다.
   - MAP_FIXED: 지정된 주소 이외에는 선택하지 않는다. 지정된 주소를 사용할 수 없으면 mmap은 실패한다. 그리고 MAP_FIXED가 지정되면 start는 페이지 크기의 배수여야 한다. 가급적 MAP_FIXED 옵션은 사용하지 않는 편이 좋다.
   - MAP_SHARED: 이 객체를 대응시키는 다른 프로세스와 대응 영역을 공유한다.
   - MAP_PRIVATE: 다른 프로세스와 대응 영역을 공유하지 않는다.
fd: 디바이스 파일의 파일 디스크립터
offset: 매핑시키고 싶은 물리 주소, 이 값은 디바이스 드라이버에 전달되지만, 디바이스 드라이버가 다른 주소를 매핑할 경우 쓰이지 않는다. 이 주소 역시 PAGE_SIZE 단위로 지정되어야 한다.


 반환값
 성공하면 대응된 영역의 포인터를 반환하고, 실패하면 MAP_FAILED(-1)이 반환되고, errno는 다음 값으로 설정된다.
EBADF: fd가 유효한 파일 디스크립터가 아니다.
EACCES: MAP_PRIVATE가 설정되었지만, fd가 읽을 수 있도록 열려있지 않다. 또는 MAP_SHARED와 PROT_WRITE가 설정되었지만, fd가 쓸 수 있도록 열려있지 않다.
EINVAL: start나 length나 offset이 적당하지 않다(즉 너무 크거나 PAGESIZE 경계로 정렬되어 있지 않다).
ETXTBUSY: MAP_DENYWRITE가 설정되었으나 fd로 지정된 객체가 쓸수 있도록 열려있다.
EAGAIN: 파일이 잠겨있거나 너무 많은 메모리가 잠겨있다.
ENOMEM: 사용할 수 있는 메모리가 없다.
 
 
munmap() 함수
 기능 할당된 메모리 영역을 해제한다.
 

형태
 #include <unistd.h>
 #include <sys/mman.h>
 
 int munmap(void* start, size_t length);
 

설명
 mmap() 함수로 할당된 메모리 영역을 해제한다. start와 length는 mmap()함수에 의해 반환된 주소와 매개변수로 지정한 length 값이어야 한다.
 

매개변수

start: mmap에 의해서 반환된 주소
length: mmap에 의해서 지정된 크기
 

반환값
 성공하면 0을 반환하고, 실패하면 -1을 반환하며, errono가 설정된다(보통EINVAL이 설정된다).
EBADF: fd가 유효한 파일 디스크립터가 아니다.
EINVAL: start나 length 혹은 offset이 적당하지 않다(즉 너무 크거나 PAGESIZE 경계로 정렬되어 있지 않다).
 
※ 출처 : IT EXPERT 리눅스 디바이스 드라이버 - 유영창​ 저​