미소를뿌리는감자의 코딩
[Pintos_project3 (18)] vm_anon_init, anon_initializer 본문
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