미소를뿌리는감자의 코딩

[Pintos_project3 (19)] anon_swap_in, anon_swap_out 본문

정글 일지

[Pintos_project3 (19)] anon_swap_in, anon_swap_out

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

1. 개요

ANON type의 페이지가 swap in/out을 다루는 코드를 작성하였다.

 

anon_swap_in의 경우엔 디스크의 swap영역에 있던 데이터를 RAM으로 가져온다.

anon_swap_out의 경우엔 RAM에서 쫓겨 나서, swap영역에 데이터를 저장하게 된다.

 

 

2. 본문

// vm/anon.c

/* Swap out the page by writing contents to the swap disk. */
static bool
anon_swap_out (struct page *page) {
	/* pseudo code
	 * swap 영역에서 slot 할당 받기
	 * (slot을 할당 받았다면) 해당 slot에 메모리 넣고, 해당 RAM을 free
	 * (swap disk 초과로 할당 받지 못했다면) 커널 패닉 */
	struct anon_page *anon_page = &page->anon;

	size_t free_idx = bitmap_scan_and_flip(swap_table, 0, 1, false); // 빈 슬롯을 탐색하고 해당 슬롯을 사용 중으로 표시. 

	if (free_idx == BITMAP_ERROR) // swap slot이 없으면 False 반환.
		return false;
	
	size_t sector = free_idx * SLOT_SIZE; // 디스크에 저장할 위치

	for (size_t i = 0; i < SLOT_SIZE; i++)
		disk_write(swap_disk, sector + i, page->va + DISK_SECTOR_SIZE *i); // swap 디스크에 페이지 데이터를 기록.
	
	anon_page->slot = free_idx; // 데이터가 저장된 swap slot에 대한 정보를 저장.

	// page 와 frame간에 링크를 끊고, pml4에서 해당 페이지를 clear
	page->frame->page = NULL;
	page->frame = NULL;
	pml4_clear_page(thread_current()->pml4, page->va);

	return true;
}

anon_swap_out의 경우엔, swap영역에서 slot을 할당 받고, 해당 슬롯을 사용 중으로 표시한다.

이후, idx * SLOT_SIZE를 통해서, sector (addr)에 대한 정보를 받아오고, swap 디스크에 페이지 데이터를 기록한다.

이후, anon_page -> slot에 해당 페이지 정보가 저장된 slot을 기록한다.

 

// vm/anon.c

/* Swap in the page by read contents from the swap disk. */
/* 디스크에서 페이지 복원. */
static bool
anon_swap_in (struct page *page, void *kva) {
	/* pseudo code 
	 * anon_page -> slot에 저장되어 있는 슬롯 정보를 가져온다.
	 * 해당 페이지 정보를 mmap을 통해 가져오고,
	 * page - frame간의 링크를 형성한다. */
	struct anon_page *anon_page = &page->anon;
	size_t slot = anon_page->slot;
	size_t sector = slot * SLOT_SIZE;

	if (slot == BITMAP_ERROR || !bitmap_test(swap_table, slot)) // 페이지가 swap 디스크에 저장된 정보가 없는 경우. 슬롯이 사용중이 아닌 경우 - false
		return false;
	
	bitmap_set(swap_table, slot, false); // swap_in이 되었으므로 해당 slot은 사용 중이 아니므로, 이를 bitmap에 표시해 준다.

	for (size_t i = 0; i < SLOT_SIZE; i ++) // SLOT_SIZE는 한 페이지를 저장하는 데 필요한 디스크 섹터 수를 의미한다.
		disk_read(swap_disk, sector + i, kva + DISK_SECTOR_SIZE * i); // 모든 섹터를 읽어와 페이지 전체 데이터를 복원.

	sector = BITMAP_ERROR; // 해당 페이지가 swap out 상태가 아님을 표시.

	return true;
}

anon_swap_in의 경우엔, 들여올 slot에 대해 bimap에 false로 사용 중이 아님을 표시해 준다.

SLOT_SIZE(페이지 크기) 만큼 데이터를 디스크에서 읽어 이를 메모리에 저장한다.

 

3. 결과

728x90