임베디드 리눅스 시스템에서 볼수 있는 세가지 형태의 주소가 있다.
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