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 경계로 정렬되어 있지 않다).
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
25 | libblkid - USB Storage의 정보 가져오기 | makersweb | 2018.10.18 | 1328 |
24 | tslib 크로스 컴파일과 터치스크린 보정 | makersweb | 2018.08.02 | 2937 |
23 | Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 | makersweb | 2018.03.07 | 7910 |
22 | NFS를 통해 파일시스템 공유 | makersweb | 2018.03.05 | 1809 |
21 | Wayland에 대한 간단한 소개 | makersweb | 2017.12.29 | 4251 |
20 | Ubuntu16.04에서 weston구동 | makersweb | 2017.12.28 | 1725 |
19 | UVC 장치를 사용할때 v4l2: select timeout 에러 발생 | makersweb | 2017.12.27 | 3084 |
18 | [IPC]D-Bus 소개 | makersweb | 2015.02.28 | 30505 |
17 | 리눅스 데스크탑 환경 종류 | pjk | 2015.02.11 | 5277 |
16 | 디바이스 드라이버에 대해서 | makersweb | 2014.04.19 | 4816 |
15 | 리눅스 커널 소스코드 구성도 | makersweb | 2014.03.04 | 6162 |
14 | read() 함수, write() 함수 | makersweb | 2014.03.04 | 12057 |
13 | 리눅스 디렉터리 구조 | makersweb | 2014.02.28 | 3871 |
12 | 1. make | pjk | 2014.02.05 | 2754 |
11 | 2. 간단한 Makefile | pjk | 2014.02.05 | 3157 |
10 | 3. 매크로(Macro) 와 확장자(Suffix) 규칙 | pjk | 2014.02.05 | 3216 |
9 | 4. Makefile를 작성할 때 알면 좋은 것들 | pjk | 2014.02.05 | 3720 |
8 | 5. make 중요 옵션 정리 | pjk | 2014.02.05 | 3096 |
7 | 6. Makefile 작성의 가이드라인 | pjk | 2014.02.05 | 2977 |
» | mmap() 함수, munmap() 함수 | pjk | 2014.02.05 | 16739 |