You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
f->rsp 가 가리키는 값이 첫번째 page_fault()함수가 실행이 된 후, 다음 page_fault()가 실행될 때 f->rsp 가 가리키는 값이 -0x40(0x4746fe80 -> 0x4746fe40) 만큼 움직이는 이유가 궁금합니다.
무언가 USER_STACK에 값이 들어왔기에 움직였다고 추측하여, 그 값이 무엇인지 궁금합니다.
아래 사진의 rsp, addr 는 각각 vm_try_handle_fault() 의 f->rsp, addr 입니다.
아래 사진의 stack_growth 출력은 stack_growth() 함수에 들어갈 때 확인하는 출력입니다.
page_fault() -> vm_try_handle_fault() 의 코드 입니다.
/* Return true on success */boolvm_try_handle_fault (structintr_frame*fUNUSED, void*addrUNUSED,
booluserUNUSED, boolwriteUNUSED, boolnot_presentUNUSED) {
structsupplemental_page_table*sptUNUSED=&thread_current()->spt;
structpage*page=NULL;
/* TODO: Validate the fault */if (addr==NULL) // 주소가 NULL이면 falsereturn false;
if (is_kernel_vaddr(addr)) // 커널 주소라면 falsereturn false;
printf("----------------------\n");
printf("rsp : %p\n",f->rsp);
printf("addr : %p\n",addr);
if (not_present) // 접근한 메모리의 physical page가 존재하지 않은 경우
{
/* TODO: Validate the fault */// todo: 페이지 폴트가 스택 확장에 대한 유효한 경우인지를 확인해야 합니다.void*rsp=f->rsp; // user access인 경우 rsp는 유저 stack을 가리킨다.if (!user) // kernel access인 경우 thread에서 rsp를 가져와야 한다.rsp=thread_current()->rsp;
// 스택 확장으로 처리할 수 있는 폴트인 경우, vm_stack_growth를 호출if (USER_STACK- (1 << 20) <= rsp-8&&rsp-8==addr&&addr <= USER_STACK)
vm_stack_growth(addr);
elseif (USER_STACK- (1 << 20) <= rsp&&rsp <= addr&&addr <= USER_STACK)
vm_stack_growth(addr);
page=spt_find_page(spt, addr);
if (page==NULL)
return false;
if (write==1&&page->writable==0) // write 불가능한 페이지에 write 요청한 경우return false;
returnvm_do_claim_page(page);
}
return false;
}
page_fault() -> vm_try_handle_fault() -> stack_growth() 코드 입니다.
/* Growing the stack. */staticvoidvm_stack_growth (void*addrUNUSED) {
/* 스택 크기를 증가시키기 위해 anon page를 하나 이상 할당하여 주어진 주소가 더 이상 예외 주소(faulted address) 가 되지 않도록 합니다. */printf("stack_growth\n");
vm_alloc_page(VM_ANON | VM_MARKER_0, pg_round_down(addr), 1);
}
이미 USER_STACK에 변수와 함수가 들어가고, 처음으로 page_fault가 난 부분이 0x4746fe80인데, 그 후 page_fault()가 실행되면, -0x40(0x4746fe40)만큼 rsp가 움직이는 이유가 무언가 값이 들어왔다는 것이 맞을까요? 위 사진 처럼 -0x40(0x4746fe80 -> 0x4746fe40) 만큼 움직이는 이유가 궁금합니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
page_fault의 intr_frame *f -> rsp 값이 움직이는 이유?
f->rsp
가 가리키는 값이 첫번째page_fault()
함수가 실행이 된 후, 다음page_fault()
가 실행될 때f->rsp
가 가리키는 값이-0x40(0x4746fe80 -> 0x4746fe40)
만큼 움직이는 이유가 궁금합니다.USER_STACK
에 값이 들어왔기에 움직였다고 추측하여, 그 값이 무엇인지 궁금합니다.rsp
,addr
는 각각vm_try_handle_fault()
의f->rsp
,addr
입니다.stack_growth
출력은stack_growth()
함수에 들어갈 때 확인하는 출력입니다.page_fault() -> vm_try_handle_fault() 의 코드 입니다.
page_fault() -> vm_try_handle_fault() -> stack_growth() 코드 입니다.
big-stk-obj 테스트 케이스 코드입니다.
Beta Was this translation helpful? Give feedback.
All reactions