Anonymous: 어떤 파일과도 연결되지 않은 페이지를 뜻함. 주로 stack or heap에 사용된다.
anonymous page를 나타내는데 쓰이는 구조체: anon_page
in include/vm/anon.h
. 현재는 비어있으나 구현하고 싶은 대로 anon page 상태 or 필요한 정보를 담을 멤버를 추가해라.
struct page에 가보면 anon page 나타내는 정보가 들어있음.
Lazy loading: 해당 메모리가 필요할 시점이 되었을 때 메모리에 load하는 설계 방식을 말한다. 페이지가 할당되는 시점을 보면, 대응하는 페이지 구조체가 생성되었으나 실제로는 physical frame이 부여되지는 않은 상태이다. 즉, 페이지 내에 어떤 정보도 올라가 있지 않다. 해당 정보는 실제로 그 정보를 CPU에서 요청하는 상황에서만 신호를 보내서 메모리에 진짜로 올린다. 이 신호가 바로 page fault이다.
세 개의 페이지 타입이 있기에 초기화 루틴은 각 페이지 종류마다 다르다. 여기서는 페이지 초기화 흐름에 대해 high-level view에서만 설명하겠다.
vm_alloc_page_with_initializer
는 커널이 새 페이지 request를 받았을 때 발동한다. 이 initializer는 페이지 구조체를 할당하고 해당 페이지 타입에 맞게 적절한 initializer를 세팅함으로써 새 페이지를 초기화한다. 그리고 다시 유저 프로그램으로 제어권을 넘긴다.(커널이 cpu 잡다가 다시 유저로 넘긴다는 말)uninit_initialize
가 발동하고 우리가 이전에 세팅해둔 initializer를 호출한다. initializer는 각 페이지 유형에 맞게 anonymous page에는 anon_initializer
를, file-backed page에는 file_backed_initializer
가 될 것이다.페이지는 다음과 같은 라이프 사이클을 갖는다.