미소를뿌리는감자의 코딩

[Pintos_project3 (10)] vm_anon_init, setup_stack 본문

정글 일지

[Pintos_project3 (10)] vm_anon_init, setup_stack

미뿌감 2024. 12. 2. 21:31
728x90

1. 개요

시스템 부팅 후, vm_init 함수에서 초기화 되는 함수로는 vm_anon_init() 과 vm_file_init()이 있다.

그 중, vm_anon_init에 대해서 알아보자.

 

setup_stack의 경우엔, 다른 페이지와 다르게 lazy하게 할당되어선 안된다. eager하게 할당해야 한다.

따라서, 바로 PM과 연결지어주도록 vm_claim_page 함수를 호출한다.

2. 본문

vm_anon_init 함수는 기능에 해당하는 디스크를 가져오고, 사용 가능한 slot의 개수를 확인한 후, bitmap을 만든다.

크게 설명할 것이 없는 것 같아 주석으로 설명하려 한다.

// vm/anon.c

/* 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 사용 가능
}

 

setup_stack도 동일하게 주석으로 설명을 이어보려 한다.

/* Create a PAGE of stack at the USER_STACK. Return true on success. */
/* 스택의 경우엔 lazy loading이 아니라, 바로 할당 되어야 한다.
 * arg1, arg2 를 stack에 넣고 (PM)
 * spt에 해당 VM를 추가하고 
 * 성공적으로 추가되었다면, sucess = true; 
 * 그게 아니라면, false를 반환.*/
static bool
setup_stack (struct intr_frame *if_) {
	bool success = false;
	void *stack_bottom = (void *) (((uint8_t *) USER_STACK) - PGSIZE);

	/* TODO: Map the stack on stack_bottom and claim the page immediately.
	 * TODO: If success, set the rsp accordingly.
	 * TODO: You should mark the page is stack. */
	/* TODO: Your code goes here */

    if (vm_alloc_page(VM_ANON | VM_MARKER_0, stack_bottom, 1)) { //가상 주소 공간에 페이지를 생성하고 SPT에 등록
        success = vm_claim_page(stack_bottom); // spt에서 페이지를 찾아 물리 메모리와 연결.

        if (success) {
            if_->rsp = USER_STACK; //다시 stack pointer를 최상단으로 설정하여, 프로세스가 스택을 올바르게 사용할 수 있도록.
            thread_current()->stack_bottom = stack_bottom;
        }
    }

	return success;
}

3. 결과

이전과 동일하다.

728x90