pjk
조회 수 18927 추천 수 1 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제

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 경계로 정렬되어 있지 않다).

TAG •

List of Articles
번호 제목 글쓴이 날짜 조회 수
25 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 2976
24 tslib 크로스 컴파일과 터치스크린 보정 makersweb 2018.08.02 4861
23 Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 file makersweb 2018.03.07 10214
22 NFS를 통해 파일시스템 공유 makersweb 2018.03.05 3172
21 Wayland에 대한 간단한 소개 file makersweb 2017.12.29 5957
20 Ubuntu16.04에서 weston구동 file makersweb 2017.12.28 3866
19 UVC 장치를 사용할때 v4l2: select timeout 에러 발생 makersweb 2017.12.27 5217
18 [IPC]D-Bus 소개 file makersweb 2015.02.28 32523
17 리눅스 데스크탑 환경 종류 pjk 2015.02.11 7008
16 디바이스 드라이버에 대해서 makersweb 2014.04.19 7103
15 리눅스 커널 소스코드 구성도 file makersweb 2014.03.04 8198
14 read() 함수, write() 함수 makersweb 2014.03.04 14432
13 리눅스 디렉터리 구조 makersweb 2014.02.28 5405
12 1. make pjk 2014.02.05 4393
11 2. 간단한 Makefile pjk 2014.02.05 5191
10 3. 매크로(Macro) 와 확장자(Suffix) 규칙 pjk 2014.02.05 4820
9 4. Makefile를 작성할 때 알면 좋은 것들 pjk 2014.02.05 6267
8 5. make 중요 옵션 정리 pjk 2014.02.05 5166
7 6. Makefile 작성의 가이드라인 pjk 2014.02.05 4292
» mmap() 함수, munmap() 함수 pjk 2014.02.05 18927
Board Pagination Prev 1 2 3 Next
/ 3