mmap 통신(1)

odnac·2023년 12월 20일
0

WSL

목록 보기
10/11

사용자 영역 함수(app)

[메모리 매핑] 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);
}

커널 영역 함수(dev)

[가상 메모리 영역에 물리 페이지 프레임을 매핑] 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);

예제 코드

사용자 영역
커널 영역

profile
https://github.com/odnac

0개의 댓글