본문 바로가기
프로그래밍 언어/시스템 프로그래밍(리눅스)

메모리 맵 파일 - 파일을 메모리에 매핑(중요)

by [Akashic Records] 개발의선지자 2024. 8. 7.

임베디드 리눅스 시스템에서 볼수 있는 세가지 형태의 주소가 있다.

 

1. 물리 주소 : 실제 메모리 버스상에서 사용되는 주소 

 

2. 가상 주소 :   프로세스가 메모리에 접근할 때 사용하는 주소

커널에서 주로 사용

 

3. 버스 주소 : CPU 외의 장치들에서 사용되는 메모리 주소

 

메모리 맵 파일 :

메모리 맵 파일을 통해 프로세스의 가상메모리 주소 공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으로 파일 읽기/쓰기를 대신한다.

1. MMAP : 파일 내용을 메모리에 매핑

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) 

 

parameter 

- addr : mapping 될 address

매핑하려는 주소를 직접 지정하거나 NULL을 사용한다. NULL을 지정하면 시스템이 가장 적합한 메모리로 데이터를 매핑

- lenght : mapping 할 길이

- prot : 보호 모드

  • PROT_EXEC : 매핑된 파일을 실행할 수 있다.
  • PROT_READ : 매핑된 파일에 읽기를 허용한다.
  • PROT_WRITE : 매핑된 파일에 쓰기를 허용한다.
  • PROT_NONE : 매핑된 파일에 접근할 수 없다.

- flag : 매핑된 데이터의 처리 방법을 지정하는 상수

  • MAP_SHARED : 다른 프로세스들 데이터의 변경 내용을 공유
  • MAP_PRIVATE : 다른 프로세스들 데이터의 변경 내용을 공유 불
  • MAP_FIXED : 매핑할 주소를 정확히 지정한다. MAP_FIXED 플래그를 지정하고 mmap 함수가 성공하면 해당 메모리 영역의 내용은 매핑된 내용으로 변경된다.

- fd(파일 디스크럽터)

- offset : 반드시 page size의 배수

 

리턴값

- 성공 시 mapping 된 주소 

- 실패 시 MAP_FAILED

 

2. MUNMAP : 파일 내용을 메모리에 매핑 해제

int munmap(void *addr, size_t length)

parameter 

- addr : mapped address

- length : mapped 길이

 

리턴값

- 성공 시 0, 실패 시 -1