미소를뿌리는감자의 코딩

[Pintos_project3 (16)] do_munmap, file_backed_destroy 본문

정글 일지

[Pintos_project3 (16)] do_munmap, file_backed_destroy

미뿌감 2024. 12. 3. 15:49
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