jun-wiki

View My GitHub Profile

Posts (Latest 10 updated) :
Read all

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))

초기화 안된 페이지 정리 아직 빈 상태