오전 7시에 기상해서 헬스장에 다녀왔다. 샤워 후 바로 출근해서 알고리즘을 풀고 점심으로 컬리에서 산 연어회로 flex하고 오후부터 mmap 수정을 시작했다.
어제 구현한 mmap은 test case는 통과했으나 사실 lazy loading이 아니였기에 대대적인 수정을 거쳤다.
void *
do_mmap (void *addr, size_t length, int writable, struct file *file, off_t offset) {
// lazy loading
uint64_t va = addr;
file = file_reopen(file);
while (length > 0) {
size_t page_read_bytes = length < PGSIZE ? length : PGSIZE;
struct file_segment *file_segment = malloc(sizeof(struct file_segment));
file_segment->file = malloc(sizeof(struct file));
memcpy(file_segment->file, file, sizeof(struct file));
file_segment->page_read_bytes = page_read_bytes;
file_segment->ofs = offset;
if(!vm_alloc_page_with_initializer(VM_FILE, va, writable, lazy_load_segment, file_segment)) {
return NULL;
}
length -= page_read_bytes;
offset += page_read_bytes;
va += PGSIZE;
}
return addr;
}
중요한 점은 우리가 처음엔 file을 직접적으로 수정했었는데 file_reopen()
을 이용하여 깊은 복사..라고 해야하나? 따로 저장해서 file_close()
후에도 접근할 수 있게 했다.
형태는 load_segment()
와 비슷하다.
bool
lazy_load_segment (struct page *page, void *aux) {
/* TODO: Load the segment from the file */
/* TODO: This called when the first page fault occurs on address VA. */
/* TODO: VA is available when calling this function. */
struct file_segment *file_segment = (struct file_segment *)aux;
struct file *file = file_segment->file;
off_t ofs = file_segment->ofs;
size_t page_read_bytes = file_segment->page_read_bytes;
size_t page_zero_bytes = file_segment->page_zero_bytes;
void *kpage = page->frame->kva;
if (kpage == NULL)
return false;
file_seek(file, ofs);
off_t actual_read_bytes = file_read(file, kpage, page_read_bytes);
switch (VM_TYPE(page->operations->type)) {
case VM_ANON:
if (actual_read_bytes != (int)page_read_bytes) {
palloc_free_page(kpage);
return false;
}
memset((uint64_t)kpage + page_read_bytes, 0, page_zero_bytes);
break;
case VM_FILE:
memset((uint64_t)kpage + actual_read_bytes, 0, PGSIZE - actual_read_bytes);
break;
}
return true;
}
그리고 lazy_load_segment()
를 static으로 선언했던 것을 제거하고 case별로 나누어 file.c로 가져와서 사용했다.
후에 munmap 구현을 시작했으나 예상했듯이 어려운 점이 많았고 같은 코드인데 다른 결과가 나와서 머리아프기도 했다. 진짜 운빨인가
협력사인 드림모션에서 채용설명회를 진행했다. 드림모션은 크래프톤의 자회사로 게임회사다.
채용설명회는 전체적으로 가벼운 분위기에서 진행되었는데 CTO님이 김정한 원장님과도 친분이 두터우셔서 다양한 이야기들을 많이 해주셨다. 우리도 무겁지 않게 들을 수 있어서 좋았고, 현실적인 이야기들도 많이 해주셔서 큰 도움이 되었다.
마지막으로 크래프톤 정글 1기를 수료하신 선배님이 같이 나오셔서 질문을 받아주셨는데, 두 분의 대화만으로 회사 분위기를 알 수 있을 정도로 편해보였고(무려 신입과 CTO 사이임에도), 선배님의 경험들을 이야기해주셔서 공감도 많이 되면서 재밌게 들을 수 있었다.
오늘 뭔가 위험한? 날이였다. 아침 운동가는 길에 자전거 체인이 빠지질 않나, 운동하다가 벤치에서 넘어질 뻔하지 않나.. 횡단보도에서 애기피하느라 애먹기도하고 목표한 바까지(사실 무리한 목표였지만) 달성하지 못하기도했다. 그래도 큰 사고없이 넘겨서 다행이다.