점심 미리 먹고 10:48 입실!
void *
do_mmap (void *addr, size_t length, int writable,
struct file *file, off_t offset) {
}
memory mapped i/o와 반대되는 개념으로 port-mapped i/o가 있음.
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: 파일 내에서 매핑 시작 위치
매핑할 길이와 오프셋을 넘기면 파일의 일정 부분만 메모리로 올려서 매핑시킬 수 있음.
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