- 이 프로젝트에서는 non-disk 기반의 image인
anonymous page
를 구현한다.- anonymous mapping에는 backing file이나 device가 없다.
- file-backed pages와 달리 named file source가 없기 때문에 anonymous.
- anonymous page는 stack과 heap같은 실행 파일에 사용된다.
include/vm/anon.h
의 anon_page
은 비어있지만, 구현할 때 필요한 정보나 상태를 저장하기 위해
추가할 수 있다.
- Lazy loading은 메모리 로드가 필요한 시점까지 지연시키는 설계
- 해당 page struct가 있지만 전용 물리적 프레임이 없으며, 실제 페이지의 내용이 로드되지 않은 상태
- 페이지 폴트가 발생하여 당장 필요해졌을 때 로드된다.
vm_alloc_page_with_initializer
가 호출된다anon_initializer
, file-backed pages의 경우 file_backed_initializer
가 된다.initialize->(page_fault->lazy-load->swap-in>swap-out->...)->destroy.
의 라이프 사이클을 가질 수 있다.VM_TYPE
)에 따라 필요한 절차가 달라진다.include/vm/vm.h
에 VM_UNINIT
라는 페이지 유형을 도입.VM_INIT
페이지로 생성된다.include/vm/uninit.h
의 uninit_page
를 제공한다.include/vm/uninit.c
에서 확인할 수 있다. (이 함수들 채워야 함)vm/vm.c
의 vm_try_handle_fault
로 전달한다.lazy-loaded
, swaped-out page
, wirte-protected page
vm_alloc_page_with_initialzer
에서 이전에 설정한 initializer 중 하나를 호출하여 segment를 lazy load한다.userprog/process.c
의 lazy_load_segment
를 구현해야 한다.Implement
vm_alloc_page_with_initializer()
. You should fetch an appropriate initializer according to the passedvm_type
and calluninit_new
with it.
bool vm_alloc_page_with_initializer (enum vm_type type, void *va,
bool writable, vm_initializer *init, void *aux);
vm.h
에 정의된 VM_TYPE
매크로를 사용하면 편리.static bool uninit_initialize (struct page *page, void *kva);
swap_in
을 호출할 때, uninit_initailize
에 도달한다.uninit_initailize
를 수정할 수 있다.vm/anon.c
에서 vm_anon_init
및 anon_initializer
를 수정할 수 있다.void vm_anon_init (void);
bool anon_initializer (struct page *page,enum vm_type type, void *kva);
page->operations
연산을 통해 anonymous page 핸들러를 설정한다.VM_ANON
)의 initializer로 사용된다.
userprog/process.c
에서load_segment
및lazy_load_segment
를 구현해야한다.
load_segment
, lazy_load_segment
userprog/process.c
를 변경static bool load_segment (struct file *file, off_t ofs, uint8_t *upage,
uint32_t read_bytes, uint32_t zero_bytes, bool writable);
aux
argument를 설정static bool lazy_load_segment (struct page *page, void *aux);
load_segment
에서 lazy_load_segment
가 vm_alloc_page_with_initializer의 네 번째 인수로 제공된다.setup_stack
을 조정해야 한다.vm/vm.h
vm_type
(e.g. VM_MARKER_0)
의 aux markers를 사용하여 표시해야한다.vm_try_handle_fault
함수를 수정하고, spt_find_page를 통해 페이지 폴트가 발생한 주소에 해당하는 page structure를 얻어와 페이지 폴트를 해결해야 한다.Implement
supplemental_page_table_copy
andsupplemental_page_table_kill
invm/vm.c
.
bool supplemental_page_table_copy (struct supplemental_page_table *dst,
struct supplemental_page_table *src);
void supplemental_page_table_kill (struct supplemental_page_table *spt);
작성 중