프로그램 실행 로직
- initd()
- supplemental_page_table_init()
- process_exec()
- load()
- load_segment(): 파일 바이트를 페이지 단위로 나누고, 페이지마다 파일의 어느 영역을 읽어야 할지 설정
- vm_alloc_page_with_inirializer(upage, lazy_load_segment): page 구조체 생성 및 할당(malloc), page 구조체와 유저 가상 주소(upage)를 매핑, page fault가 발생하면, lazy_load_segment()를 호출하도록 설정.
- uninit_new (new_page, upage, lazy_load_segment)
- spt_insert_page(): 보조 페이지 테이블 생성 및 page 데이터 입력
- vm_alloc_page_with_inirializer(upage, lazy_load_segment): page 구조체 생성 및 할당(malloc), page 구조체와 유저 가상 주소(upage)를 매핑, page fault가 발생하면, lazy_load_segment()를 호출하도록 설정.
- setup_stack()
- load_segment(): 파일 바이트를 페이지 단위로 나누고, 페이지마다 파일의 어느 영역을 읽어야 할지 설정
- do_iret(): 프로그램 실행
- load()
Page Fault 로직
- page_fault()
- vm_try_handle_fault()
- vm_do_claim_page(): frame 구조체 생성 및 할당(vm_get_frame())
- pml4_set_page(): page와 frame 매핑
- swap_in(): uninit_initialize 호출
- uninit_initialize()
- anon_initializer()
- lazy_load_segment(): 파일의 특정 페이지를 읽고 물리 메모리에 저장한다. false이면 page_fault로 돌아가서 exit(-1)
- file_read()
- vm_do_claim_page(): frame 구조체 생성 및 할당(vm_get_frame())
- vm_try_handle_fault()
check_address() 수정
// userprog/syscall.c in Project 2
void
check_address(void *addr) {
if (!is_user_vaddr (addr) || addr == NULL || pml4_get_page (&t->pml4, addr) == NULL) {
exit (-1);
}
}
- Project 2에서는 Eager loading 방식을 사용한다.
- load할 때, 파일의 모든 페이지를 페이지 테이블(pml4)에 매핑한다.
- 따라서 check_address하는 시점에 참조하고자 하는 데이터(addr)는 페이지 테이블(pml4)에 반드시 존재해야 한다.
// userprog/syscall.c in Project 3
void
check_address(void *addr) {
if (!is_user_vaddr (addr) || addr == NULL) {
exit (-1);
}
}
- Project 3에서는 Lazy loading 방식을 사용한다.
- load할 때, 파일을 읽지 않고 보조 페이지 테이블(SPT)에만 매핑한다.
- 페이지 테이블에는 매핑하지 않는다.
- 페이지 테이블은 Page Fault 시에 frame 구조체를 생성한 후 매핑된다.
- 따라서 시스템 콜이 호출되고 check_address하는 시점에 참조하고자 하는 데이터(addr)이 페이지 테이블(pml4)에 존재하지 않을 수 있다!
'프로젝트 > Pint OS' 카테고리의 다른 글
[Pint OS] Lazy loading(3) (0) | 2023.06.22 |
---|---|
[Pint OS] Lazy loading(2) (0) | 2023.06.19 |
[Pint OS] System Calls (6) (0) | 2023.06.17 |
[Pint OS] 에러: multi-oom (0) | 2023.06.17 |
[Pint OS] System Calls (5) (1) | 2023.06.14 |