미소를뿌리는감자의 코딩
[Pintos_project3 (10)] vm_anon_init, setup_stack 본문
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
'정글 일지' 카테고리의 다른 글
[Pintos_project3 (12)] supplemental_page_table_copy, supplemental_page_table_kill (0) | 2024.12.02 |
---|---|
[Pintos_project3 (11)] vm_try_handle_fault (0) | 2024.12.02 |
[Pintos_project3 (9)] vm_claim_page, vm_do_claim_page (0) | 2024.12.02 |
[Pintos_project3 (8)] vm_get_frame, vm_evict_frame, vm_get_victim (0) | 2024.11.30 |
[Pintos_project3 (7)] setup_stack (0) | 2024.11.30 |