Programming/system programming

[linux] mmap sys call

jianna6 2015. 11. 1. 12:17

원문 http://blog.naver.com/saiezo/120194833729

참조: http://man7.org/linux/man-pages/man2/mmap.2.html

http://unix.superglobalmegacorp.com/Net2/newsrc/sys/mman.h.html


#include <unistd.h>

#include <sys/mman.h>

void* mmap(void* start, size_t length, int port, int flags, int fd, off_t offset)


mmap() 함수는 fd로 지정된 디바이스 파일의 내용을 offset에 해당하는 물리 주소에서 시작하여 length 바이크 만큼을 start 주소로 copy해준다. (map or unmap files or devices into memory)


● start : 요청한 물리 주소 공간을 매핑하고자 하는 주소로, 보통 '0'을 사용, 강제적인 요구가 아니기 때문에 다른 값을 지정해도 꼭 그 값으로 매핑시켜 반환되지는 않는다.

● length : 매핑하고자 하는 주소 공간의 크기로, PAGE_SIZE의 배수여야 한다

● prot : 메모리 보호 모드를 설정한다

- PORT_EXEC : 페이지가 실행될 수 있다

- PORT_READ : 페이지를 읽을 수 있다

- PORT_WRITE : 페이지에 쓸 수 있다

- PORT_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_SHAFED와 PROT_WRITE가 설정되었지만, fd가 쓸 수 있도록 열려 있지 않다

- EINVAL : start나 length나 offset이 적당하지 않다.(너무 크거나 PAGESIZE 경계로 정렬되어 있지 않다)

 ETXTBUSY : MAP_DENYWRITE가 설정되었으나 fd로 지정된 객체가 쓸 수 있도록 열려 있다

- EAGAIN : 파일이 잠겨있거나 너무 많은 메모리가 잠겨 있다

- ENOMEM : 사용할 수 있는 메모리가 없다