6/23 PintOS Project3(7)

JK·2023년 6월 23일

Memory Mapped Files

오늘도 어제에 이어서 구현을 이어가겠습니다 :)

file_backed_initializer

파일 지원 페이지를 초기화합니다. 이 함수는 먼저 에서 파일 지원 페이지에 대한 핸들러를 설정합니다 page->operations. 메모리를 지원하는 파일과 같은 페이지 구조에 대한 일부 정보를 업데이트할 수 있습니다.

bool
file_backed_initializer(struct page *page, enum vm_type type, void *kva) {
	/* Set up the handler */
	// 먼저 page->operations에 file-backed pages에 대한 핸들러를 설정합니다.
	page->operations = &file_ops;

	struct file_page *file_page = &page->file;

	// todo: page struct의 일부 정보(such as 메모리가 백업되는 파일과 관련된 정보)를 업데이트할 수도 있습니다.
	struct lazy_load_arg *lazy_load_arg = (struct lazy_load_arg *)page->uninit.aux;
	file_page->file = lazy_load_arg->file;
	file_page->ofs = lazy_load_arg->ofs;
	file_page->read_bytes = lazy_load_arg->read_bytes;
	file_page->zero_bytes = lazy_load_arg->zero_bytes;
	return true;
}

위의 코드는 file_backed_initializer 함수입니다.

1. 함수 시그니처:

file_backed_initializer 함수는 파일을 백업으로 사용하는 페이지에 대한 초기화 작업을 수행합니다

2. 함수 동작:

  1. 페이지의 operations 멤버를 파일 백업 페이지를 처리하는 핸들러인 file_ops로 설정합니다.

  2. 페이지의 file_page 멤버를 얻습니다.

  3. page의 uninit.aux를 lazy_load_arg라는 구조체 포인터로 형변환하여 얻습니다. 이 구조체는 페이지 초기화에 필요한 파일 관련 정보를 담고 있습니다.

  4. file_page의 필드에 lazy_load_arg로부터 얻은 정보를 업데이트합니다. 이 정보에는 백업되는 파일, 오프셋, 읽을 바이트 수, 0으로 채울 바이트 수 등이 포함됩니다.

  5. 초기화가 성공적으로 수행되었음을 나타내기 위해 true를 반환합니다.

file_backed_initializer 함수는 파일을 백업으로 사용하는 페이지에 대한 초기화 작업을 수행합니다. 이를 통해 해당 페이지를 파일로부터 로드하고 적절한 정보를 설정하여 파일 백업 페이지로 사용할 수 있게 됩니다

file_backed_destroy

관련 파일을 닫아 파일 지원 페이지를 파괴합니다. 내용이 더러운 경우 변경 사항을 파일에 다시 기록해야 합니다. 이 함수에서 페이지 구조를 해제할 필요는 없습니다. 호출자가 file_backed_destroy 처리해야 합니다.

static void
file_backed_destroy(struct page *page)
{
	// page struct를 해제할 필요는 없습니다. (file_backed_destroy의 호출자가 해야 함)
	struct file_page *file_page UNUSED = &page->file;
	if (pml4_is_dirty(thread_current()->pml4, page->va))
	{
		file_write_at(file_page->file, page->va, file_page->read_bytes, file_page->ofs);
		pml4_set_dirty(thread_current()->pml4, page->va, 0);
	}
	pml4_clear_page(thread_current()->pml4, page->va);
}

위의 코드는 file_backed_destroy 함수입니다.

1. 함수 시그니처:

file_backed_destroy 함수는 파일 백업 페이지를 해제할 때 수행되는 작업을 처리합니다

2. 함수 동작:

  1. 페이지의 file_page 멤버를 얻습니다.

  2. 페이지의 va (가상 주소)를 사용하여 해당 페이지가 변경되었는지 확인합니다. 이를 위해 pml4_is_dirty 함수를 사용합니다.

  3. 페이지가 변경되었다면, file_page의 file에 해당하는 파일에 변경된 내용을 기록합니다. file_write_at 함수를 사용하여 파일의 오프셋 위치에 페이지의 내용을 씁니다. 쓰여진 바이트 수는 file_page의 read_bytes에 해당합니다.

  4. 페이지의 변경 플래그를 초기화하기 위해 pml4_set_dirty를 호출하여 해당 페이지가 변경되지 않음을 표시합니다.

  5. 페이지와 연결된 가상 주소를 가리키는 페이지 테이블 엔트리를 해제하기 위해 pml4_clear_page를 호출합니다.

file_backed_destroy 함수는 파일 백업 페이지를 해제할 때 필요한 작업을 수행합니다. 주로 변경된 페이지를 파일로 다시 기록하고 페이지 테이블 엔트리를 해제하는 역할을 담당합니다. 실제 페이지 구조체의 해제는 이 함수의 호출자가 수행해야 합니다.

profile
^^

0개의 댓글