Page fault at 0x400c10: not present error reading page in user context.
Page fault at 0x4747ffb8: rights violation error writing page in user context.
SPT 자료구조 구현
↓
페이지 초기화 골격 구현
↓
세그먼트 지연 등록 구현
↓
페이지 폴트 처리 경로
↓
프레임 최소 구현
↓
lazy_load_segment 구현
↓
스택 임의 설정
↓
vm 관리 함수
(페이지 할당, claim)
↓
보조 페이지 테이블 연산
(copy, kill)
↓
초기화 안된 페이지 정리
uninit_destroy, 그 중
anon_destroy구현
SPT 자료구조 구현은 hash_table로 처리
vm_alloc_page_with_initializer() 함수로 페이지 할당 및 초기화 골격 구현
GitBOOK 요구 사항대로 SPT에 가상주소 등록여부 확인 없다면 새 페이지 구조체 동적 할당 vm_type에 따라 적절한 초기화 함수 선택(initializer)
익명페이지: anon_initializer
파일페이지: file_backed_initializer
이후 uninit_new()호출 임시 uninit 상태로 생성
uninit이니 나중에 사용할때 init 이제 위에서 만든 해시테이블에 삽입
세그먼트 지연 등록 구현 process.c의 load_segment는 즉시 로드다 이를 수정해서 지연 로딩으로 바꾼다
맨밑에 ifdef VM문으로 스켈레톤 있으니 이를 갖고 처리
기존의 install_page()
대신 매 페이지마다
위에서 만든 vm_alloc_page_with_initializer(VM_FILE, upage, writable, lazy_load_segment, aux)호출
aux에는 file, ofs, read_bytes, zero_bytes 저장
이 호출을 통해 메모리로 읽지도 않고 내용준비 완료
페이지 폴트 처리 경로 지연 로딩 등록했으니 이를 처리하는 경로 구현 exception.c
프레임 최소 구현 지연 로딩된 페이지 실제 할당 위한 물리 메모리 프레임 vm_get_frame()과 vm_do_claim_page() vm_get_frame에서 palloc, PAL_USER로 프레임 얻고 프레임 구조체(struct frame) 할당
vm_do_claim_page(page)에서 swap_in(page, frame->kva)호출 uninit이면 lazy_load_segment()로 내용 채우고 pml4_set_page()
eviction(추출)은 아직 미구현
lazy_load_segment 구현 첫 페이지 폴트 발생 시 호출되어 해당 페이지 실제 메모리로 로드한다
uninit_initializer() (unini.c에 있음)를 통해 page->operation을 UNINIT에서 FILE/ANON으로 바꿔 실제 타입으로 변환한다
이후 lazy_load_segment를 호출해 파일 읽고 0으로 패딩 (진짜 디스크 읽기)
스택 임의 설정 프로세스 시작시 setup_stack()으로 즉시 준비, 0으로 채우기 추가 성장 미구현
VM 관리 함수 구현 위의 동작 하기 위한 것들 페이지 할당 및 클레임 관련 함수 -> 등록과 실물 연결 분리
vm_alloc_page_with_initializer() 등록만
vm_claim_page(va) 실물 연결, 프레임 잡고 swap_in으로 채우고 pml4_set_page로 매핑
vm_do_claim_page() 프레임 확보하고 링크하고 내용 채우고 페이지 테이블 매핑 -> vm_get_frame() 프레임 확보 -> frame <-> page 링크 -> swap_in(page, frame->kva)로 내용채우기 UNINIT이면 lazy_load_segment 호출 -> pml4_set_page(page->va, frame->kva, page->writable)로 페이지 테이블 매핑
보조 페이지 테이블 연산 copy, kill 아직 구현ing
supplemental_page_table_copy(dst, src) (supplemental_page_table_kill(spt))
초기화 안된 페이지 정리 아직 빈 상태