Anonymous: 어떤 파일과도 연결되지 않은 페이지를 뜻함. 주로 stack or heap에 사용된다.

anonymous page를 나타내는데 쓰이는 구조체: anon_page in include/vm/anon.h. 현재는 비어있으나 구현하고 싶은 대로 anon page 상태 or 필요한 정보를 담을 멤버를 추가해라.

struct page에 가보면 anon page 나타내는 정보가 들어있음.

Page Initialization with Lazy Loading

Lazy loading: 해당 메모리가 필요할 시점이 되었을 때 메모리에 load하는 설계 방식을 말한다. 페이지가 할당되는 시점을 보면, 대응하는 페이지 구조체가 생성되었으나 실제로는 physical frame이 부여되지는 않은 상태이다. 즉, 페이지 내에 어떤 정보도 올라가 있지 않다. 해당 정보는 실제로 그 정보를 CPU에서 요청하는 상황에서만 신호를 보내서 메모리에 진짜로 올린다. 이 신호가 바로 page fault이다.

세 개의 페이지 타입이 있기에 초기화 루틴은 각 페이지 종류마다 다르다. 여기서는 페이지 초기화 흐름에 대해 high-level view에서만 설명하겠다.

  1. vm_alloc_page_with_initializer 는 커널이 새 페이지 request를 받았을 때 발동한다. 이 initializer는 페이지 구조체를 할당하고 해당 페이지 타입에 맞게 적절한 initializer를 세팅함으로써 새 페이지를 초기화한다. 그리고 다시 유저 프로그램으로 제어권을 넘긴다.(커널이 cpu 잡다가 다시 유저로 넘긴다는 말)
  2. 유저 프로그램이 실행되는 시점에서 page fault가 발생한다. 왜냐면 유저 프로그램은 이미 페이지에 정보가 있다고 믿고 page에 접근하려고 시도할 텐데 현재 해당 페이지에는 어떠한 정보도 들어있지 않기 때문이다.
  3. fault를 다루는 과정 동안, uninit_initialize가 발동하고 우리가 이전에 세팅해둔 initializer를 호출한다. initializer는 각 페이지 유형에 맞게 anonymous page에는 anon_initializer를, file-backed page에는 file_backed_initializer가 될 것이다.

페이지는 다음과 같은 라이프 사이클을 갖는다.