Anonymous Page를 구현한다.

Anonymous Page

페이지의 유형이 Anon page라면, struct page 안의 union 중 struct anon_page anon;이라는 구조체 멤버가 들어간다.

Lazy Loading(Demanding Paging)에서의 페이지 초기화

프로세스를 구성하는 모든 페이지를 먼저 메모리에 올려놓는 것이 아닌, 필요할 때마다 그때그때 메모리에 올리는 기법이다. 필요한지를 어떻게 아느냐? 바로 Page Fault를 통해 알 수 있다.

Lazy loading에서 페이지 초기화는 어떻게 진행되는가?

페이지의 유형에 따라 달라지기는 하지만, 크게 보면 다음과 같다.

하나의 페이지는

초기화 → Lazy Loading(페이지 폴트 → Lazy load → Swap-in → Swap-out) → Destroy

의 사이클을 거치게 된다.

Lazy Loading

레이지 로드를 실현시키기 위해 VM_UNINIT 페이지 타입이 있다. 맨 처음 페이지가 만들어지면 모두 VM_UNINIT 타입으로 만들어진다. 그 후 ANON 타입이나 FILE-BACKED 타입으로 변환된다. 그 전에 해당 페이지에 프로그램이 접근하려 하면 페이지 폴트가 발생하고 초기화를 진행해주어야 한다.

페이지 폴트 핸들러(userprog/exception.c/page_fault)는 페이지 폴트 발생 시 맨 먼저 이 페이지 폴트가 유효한 페이지 폴트인지를 체크한다. 유효한 페이지 폴트란, 프로그램이 유효하지 않은 페이지, 즉 메모리에 올려져 있지 않은 페이지에 접근할 때를 말하는 듯 하다.

하지만 유효한 페이지를 접근했을 때에도 페이지 폴트가 뜨는 경우가 있는데, 이를 가짜 페이지 폴트 Bogus Page Fault라고 부른다. 이 경우는 페이지에 세부 정보들을 load하고 다시 유저 프로그램에게 제어권을 양보한다.

가짜 페이지 폴트