미소를뿌리는감자의 코딩
[Pintos_project3 (16)] do_munmap, file_backed_destroy 본문
728x90
1. 개요
do_munmap의 경우엔 할당된 페이지를 해제하고, 해당 파일을 위해 할당되었던 PM도 해제하는 함수이다.
2. 본문
void
do_munmap (void *addr) {
/* pseudo
* va에 대해서 spt 확인을 통해 dirty bit 확인
* (작성된 경우) file에 반영 시키고 반환
* (작성 안된 경우) file에 반영 안하고 반환
*/
struct thread *curr = thread_current();
struct page *page;
lock_acquire(&filesys_lock);
while((page = spt_find_page(&curr->spt, addr))) {
if (page)
destroy(page); // destory(page)를 한다는 건, 해당 프로세스를 위해 PM에 할당된 메모리 지우기.
addr += PGSIZE;
}
lock_release(&filesys_lock);
}
해당 코드를 참고하기에 앞서 pseudo code로 dirty bit에 대한 처리를 아마도 할 것이라고 예상했었다.
하지만, 해당 코드에선 그런 부분이 없었기에,
이에 .destroy함수가 사용하고 있는 file_backed_destory에 해당 로직을 구현해 주어야 했다.
// vm/file.c
/* Destory the file backed page. PAGE will be freed by the caller. */
static void
file_backed_destroy (struct page *page) {
struct file_page *file_page UNUSED = &page->file;
if (pml4_is_dirty(thread_current()->pml4, page->va)) { //pml4페이지에서 해당 페이지가 dirty인지 확인.
file_write_at(file_page->file, page->va, file_page->page_read_bytes, file_page->offset);
pml4_set_dirty(thread_current()->pml4, page->va, false); // file에 수정 사항을 반영 했으므로, dirty = false;
}
if (page->frame) {// page와 frame사이에 link를 해제하고, frame 또한 해제한다. page는 caller가 해제할 것이다.
list_remove(&page->frame->frame_elem);
page->frame->page = NULL;
page->frame = NULL;
free(page->frame);
}
pml4_clear_page(thread_current()->pml4, page->va); // pml4에 있던 va도 clear한다.
}
file_backed_destory는 페이지가 dirty인지 확인하고 dirty이다면 수정 사항을 file에 반영해 주었다.
이후, page와 frame의 연관관계 (링크)를 끊고, frame을 free해주었다.
file.h에서, file_page 멤버를 설정해주어야 한다.
// include/vm/file.h
struct file_page {
struct file *file;
off_t offset;
size_t page_read_bytes;
};
3. 결과
테스트 40개가 실패했다.
이전보다 1개 더 실패했다.
728x90
'정글 일지' 카테고리의 다른 글
[Pintos_project3 (19)] anon_swap_in, anon_swap_out (0) | 2024.12.03 |
---|---|
[Pintos_project (17)] vm_file_init, file_backed_initializer (0) | 2024.12.03 |
[Pintos_project3 (15)] do_mmap (0) | 2024.12.03 |
[Pintos_project3 (14)] vm_try_handle_fault, vm_stack_growth (0) | 2024.12.03 |
[Pintos_project3 (13)] uninit_destory, anon_destory (0) | 2024.12.02 |