미소를뿌리는감자의 코딩

[Pintos_project3 (18)] vm_anon_init, anon_initializer 본문

카테고리 없음

[Pintos_project3 (18)] vm_anon_init, anon_initializer

미뿌감 2024. 12. 3. 16:37
728x90

1. 개요

Swap In/Out에 대한 코드를 작성하기 위해 위 함수를 재 작성해야 한다.

 

2. 본문

/* Initialize the data for anonymous pages */
/* HDD과 연관되지 않는 anon type에 대해, init을 */
void vm_anon_init(void) {
    /* TODO: Set up the swap_disk. */
    swap_disk = disk_get(1, 1); // 1:1 (스왑공간)에 해당하는 디스크를 반환. ; 즉, 스왑 디스크 반환
    slot_max = disk_size(swap_disk) / SLOT_SIZE; // 디스크 크기와 슬롯 크기를 이용해 사용할 수 있는 스왑 슬롯의 최대 개수를 계산
    swap_table = bitmap_create(slot_max); // 스왑 슬롯 사용여부를 확인하기 위해 비트를 이용. 따라서, slot_max의 크기에 해당하는 bit string 생성 
	                                      // ex) 01000001 이면 1 사용중 / 0 사용 가능
}
/* Initialize the file mapping */
bool
anon_initializer (struct page *page, enum vm_type type, void *kva) { // kva; kernel virtual address
	/* Set up the handler */
	/* <Pseudo>
	 * 페이지가 지금 UNINIT으로 설정되어 있으니까, 이를 페이지 type에 따라서 다르게 설정해 줌. */
	struct uninit_page *uninit = &page->uninit; // page의 union중 하나에서 설정되어 있는 uninit을 가지고 옴.
	memset(uninit, 0, sizeof(struct uninit_page)); // vm에서 페이지를 차지하고 있는 대상 uninit page에 대해서 0으로 초기화.

	page->operations = &anon_ops; // uninit과 관련된 operations에서 anon_ops operation을 설정해 줌.

	struct anon_page *anon_page = &page->anon;// page union에서 UNINIT이 아니라, anon을 가리키도록 설정.
	anon_page->slot = BITMAP_ERROR; // 아직 해당 페이지가 Swap 영역에 저장되지 않았음을 나타냄. 유효한 swap 슬롯이 없음.

	return true;
}

vm_anon_init을 통해 디스크 할당을 한다.

이는 이전 포스팅에서 적었었기 때문에 넘어간다.

 

anon_initializer의 경우엔, 

anon_page->slot = BITMAP_ERROR;

이 코드만 추가되었다. anon_page에서 slot이 아직 사용되지 않음을 나타내기 위해 BITMAP_ERROR; 로 초기화 해준다.

 

3. 결과

728x90