[메모리 매핑] mmap
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
/*
addr : 원하는 가상 주소. 주로 NULL을 사용하며, 시스템이 적절한 주소를 선택하게 합니다.
length: 매핑할 영역의 길이 (바이트 단위).
prot: 페이지 보호 속성. 페이지를 읽기, 쓰기, 실행 가능하게 하는 등의 옵션을 설정합니다.
flags: 매핑의 특성을 지정하는 플래그. 주로 MAP_SHARED 또는 MAP_PRIVATE를 사용하여 공유 메모리 또는 개별 메모리를 설정합니다.
fd: 매핑할 파일의 파일 디스크립터. 파일이나 디바이스를 매핑하는 경우 해당 파일이나 디바이스를 엽니다.
offset: 파일에서 매핑을 시작할 위치 (바이트 단위). 일반적으로 0으로 설정하며 파일 전체를 매핑할 때 사용됩니다.
mmap 함수는 성공할 경우 매핑된 메모리의 시작 주소를 반환하고, 실패할 경우 (void *)-1을 반환합니다. 반환된 메모리 주소는 사용자 프로세스에서 해당 영역에 직접 접근할 때 사용됩니다.
*/
[매핑된 파일 변경사항을 디스크에 동기화] msync
// 동기화
#define MAPPED_SIZE 4096 // getpagesize()로 얻어낼 수 있음
msync(map, MAPPED_SIZE, MS_SYNC);
{
perror("Error in msync");
printf("errno: %d\n", errno);
}
[가상 메모리 영역에 물리 페이지 프레임을 매핑] remap_pfn_range
#include <linux/mm.h>
int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr,
unsigned long pfn, unsigned long size, pgprot_t prot);
/*
vma: 가상 메모리 영역을 나타내는 구조체(vm_area_struct).
virt_addr: 가상 주소의 시작 위치.
pfn: 물리 페이지 프레임 번호.
size: 매핑할 크기 (바이트 단위).
prot: 페이지 보호 속성.
주어진 가상 주소 범위에 해당 물리 페이지 프레임을 매핑할 수 있습니다. 일반적으로 디바이스 드라이버나 메모리 매핑과 관련된 작업에서 사용됩니다.
*/
[가상 메모리 주소를 물리 메모리 주소로 변환] virt_to_phys
#include <asm/io.h>
phys_addr_t virt_to_phys(volatile const void *address);
/*
address: 가상 주소
virt_to_phys 함수는 주어진 가상 주소에 해당하는 물리 주소를 반환합니다. 이 함수는 가상 주소에서 물리 주소로의 변환을 수행합니다.
*/
[시스템의 페이지 크기 반환] getpagesize
int page_size;
page_size = getpagesize();
printf("Page size: %d\n", page_size);