정글 일지

[Pintos_project3 (7)] setup_stack

미뿌감 2024. 11. 30. 19:52
728x90

1. 개요

stack의 경우엔, lazy가 아니라 바로 memory와 mapping을 해주어야 한다.

 

2. 코드

/* 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;
}
#endif /* VM */

 

 

user_stack에서 한 페이지 만큼을 내려서 stack_bottom을 선언해 주었다.

 

이후, vm_alloc_page로 VM에 공간을 할당받고, vm_claim_page를 통해 PM와 mapping 시켜주었다.

성공했다면, stack pointer를 최상단으로 설정해주어, 프로세스가 스택을 올바르게 사용할 수 있도록 해주었다.

 

3. 결과

123 of 141 tests failed로 테스트 결과를 확인할 수 있었다.

728x90