Anonymous Page를 구현한다.
페이지의 유형이 Anon page라면, struct page
안의 union 중 struct anon_page anon;
이라는 구조체 멤버가 들어간다.
프로세스를 구성하는 모든 페이지를 먼저 메모리에 올려놓는 것이 아닌, 필요할 때마다 그때그때 메모리에 올리는 기법이다. 필요한지를 어떻게 아느냐? 바로 Page Fault를 통해 알 수 있다.
Lazy loading에서 페이지 초기화는 어떻게 진행되는가?
페이지의 유형에 따라 달라지기는 하지만, 크게 보면 다음과 같다.
vm_alloc_page_with_initializer()
가 호출된다. 새 페이지 구조체를 할당받고 초기화한 다음, 페이지 타입에 맞는 초기화 함수를 설정한다. 그 후 다시 유저 프로그램에게 제어권을 넘긴다.uninit_initialize
가 호출되어 아까 앞에서 설정해준 초기화 함수가 호출된다. Anon page의 경우 anon_initializer
를, File-backed page의 경우 file_backed_initializer
를 부른다.하나의 페이지는
초기화 → Lazy Loading(페이지 폴트 → Lazy load → Swap-in → Swap-out) → Destroy
의 사이클을 거치게 된다.
레이지 로드를 실현시키기 위해 VM_UNINIT
페이지 타입이 있다. 맨 처음 페이지가 만들어지면 모두 VM_UNINIT
타입으로 만들어진다. 그 후 ANON 타입이나 FILE-BACKED 타입으로 변환된다. 그 전에 해당 페이지에 프로그램이 접근하려 하면 페이지 폴트가 발생하고 초기화를 진행해주어야 한다.
페이지 폴트 핸들러(userprog/exception.c/page_fault
)는 페이지 폴트 발생 시 맨 먼저 이 페이지 폴트가 유효한 페이지 폴트인지를 체크한다. 유효한 페이지 폴트란, 프로그램이 유효하지 않은 페이지, 즉 메모리에 올려져 있지 않은 페이지에 접근할 때를 말하는 듯 하다.
하지만 유효한 페이지를 접근했을 때에도 페이지 폴트가 뜨는 경우가 있는데, 이를 가짜 페이지 폴트 Bogus Page Fault라고 부른다. 이 경우는 페이지에 세부 정보들을 load하고 다시 유저 프로그램에게 제어권을 양보한다.
가짜 페이지 폴트