[크래프톤 정글 3기] 12/26(화) TIL

ClassBinu·2023년 12월 26일
0

크래프톤 정글 3기 TIL

목록 보기
70/120

점심 미리 먹고 10:48 입실!

Pintos

mmap에서 알아야 할 것

  1. 메모리 접근하는 것처럼 파일 읽기/쓰기 가능
  2. 메모리 기반이니까 빠름
  3. 여러 프로세스가 동일한 파일 메모리에 매핑 가능(프로세스 간 데이터 공유 가능)
  4. Lazy loading으로 페이지 단위로 파일 로드 -> 메모리 사용 최적화
  5. atomic한 업데이트
  6. 커널 모드가 아닌 사용자 모드에서 파일 제어 가능(파일I/O 시스템콜은 커널 모드에서만 가능)
void *
do_mmap (void *addr, size_t length, int writable,
		struct file *file, off_t offset) {
}

memory mapped i/o와 반대되는 개념으로 port-mapped i/o가 있음.

mmap() 구현

void *mmap (void *addr, size_t length, int writable, int fd, off_t offset) {
	if (!addr || addr != pg_round_down(addr))
		return NULL;
	
	if (offset != pg_round_down(offset))
		return NULL;

	if (!is_user_vaddr(addr)|| !is_user_vaddr(addr + length))
		return NULL;

	if (spt_find_page(&thread_current()->spt, addr))
		return NULL;

	struct fild *f = process_get_file(fd);
	if (f == NULL)
		return NULL;

	if (file_length(f) == 0 || (int)length <= 0)
		return NULL;
	
	return do_mmap(addr, length, writable, f, offset);
};

mmap()과 do_mmap()을 나눠서 구현하는 이유는?
시스템의 내부 구조화와 가독성을 개선
mmap은 유저 수준에서 호출, do_mmap은 시스템 수준에서 호출
추상화, 보안 등의 이유도 있음.(상위 래핑 함수에서 호출 적절성 평가 가능)

매개변수 분석

void addr: 매핑할 가상 주소, NULL로 설정하면 커널이 적절하게 배정함
size_t length: 매핑할 길이(파일 크기, 매필 리소스 크기, 바이트 단위)
int writable: 매핑 메모리 영역 쓰기 가능한지(0: 읽기, 1 쓰기 가능)
struct file
file: 매핑 파일, 구조체를 전달해야 함.
off_t offset: 파일 내에서 매핑 시작 위치

매핑할 길이와 오프셋을 넘기면 파일의 일정 부분만 메모리로 올려서 매핑시킬 수 있음.

do_munmap

void munmap (void *addr) {
	do_munmap(addr);
}
void
do_munmap (void *addr) {
}

이거 기존에 매핑한 메모리를 해제하는 것!
매핑된 메모리 위치를 넘겨주면 해제한다!

mmap에서 메모리를 수정하면 디스크에도 변경 사항이 반영되는 이유는?
munmap할 때 디스크 쓰기 작업 발생함.


vm_entry

  • vaddr(가상주소)
  • padddr(물리 주소)
  • fd
  • offset
  • type
  • writable, is_loaded
  • swap_slot

코치님께 이력서 코칭 1:1로 1시간 30분 동안 받음.
개발자로서 이력서 작성 방향에 대해서 심도 있는 코칭을 받을 수 있었음.
정글이 아니었다면 시니어 개발자에게 이렇게 밀도 있는 코칭을 받을 수 있었을까?
정글 만세다..🙌


이거 책 읽어보기
(개발바닥에서 나온 책)
https://www.yes24.com/Product/Goods/67350256

0개의 댓글