미소를뿌리는감자의 코딩
[Pintos_project3 (19)] anon_swap_in, anon_swap_out 본문
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
'정글 일지' 카테고리의 다른 글
[Pintos_project3 (21)] extra (2) | 2024.12.03 |
---|---|
[Pintos_project3 (20)] file_backed_swap_in/out (0) | 2024.12.03 |
[Pintos_project (17)] vm_file_init, file_backed_initializer (0) | 2024.12.03 |
[Pintos_project3 (16)] do_munmap, file_backed_destroy (0) | 2024.12.03 |
[Pintos_project3 (15)] do_mmap (0) | 2024.12.03 |