한국어
Linux Programming
 

mmap() 함수, munmap() 함수

pjk 2014.02.05 15:38 조회 수 : 15381 추천: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 경계로 정렬되어 있지 않다).

번호 제목 글쓴이 날짜 조회 수
44 리눅스 Qt 응용프로그램 AppImage 로 구축 makersweb 2024.01.07 555
43 GRUB의 timeout 설정 makersweb 2023.11.07 563
42 lubuntu 22.04 LTS 설치 file makersweb 2023.01.23 1485
41 시스템에서 사용 가능한 D-Bus 서비스를 보려면? makersweb 2022.12.29 1287
40 리눅스에서 네트워크 구성 makersweb 2022.06.11 2935
39 D-Bus ObjectManager file makersweb 2022.02.12 675
38 ifconfig 는 대부분 ip 명령으로 대체 makersweb 2022.02.12 1655
37 SocketCAN 유틸 사용방법 file makersweb 2022.02.05 7278
36 dbus-broker를 기본 DBus 구현으로 설정 makersweb 2021.01.20 1250
35 리눅스 오디오 스택과 아키텍처 file makersweb 2020.09.02 2935
34 wayland-scanner 를 통해 Wayland 프로토콜 코드생성 makersweb 2020.06.08 973
33 Wayland 의 Client Application 프로그래밍 기본 루틴 makersweb 2020.06.04 1710
32 Wayland 의 주요 객체들 makersweb 2020.06.04 945
31 Weston 의 설명 및 관련 컴포넌트 makersweb 2020.06.03 2546
30 64비트 리눅스에서 32비트 응용프로그램을 실행하려면 makersweb 2020.02.29 1825
29 initramfs (initial ram file system: 초기 램 파일 시스템) makersweb 2020.02.25 2115
28 플랫폼 디바이스 드라이버 개발 시 많이 사용되는 커널 API 및 매크로 makersweb 2020.01.28 4758
27 PATH에 새로운 경로 추가 makersweb 2019.09.19 401
26 리눅스 컴파일러 최신으로 업데이트 linux 2018.12.26 1900
25 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 676