Pintos Project 3 Virtual Memory

Park Choong Ho·2021년 10월 28일
0

Memory Management

Project2까지는 프로세스가 하나의 물리 메모리를 모두 다쓰고 만약 물리 메모리가 더이상 할당할 영역이 없으면 Page Fault가 나고 Page Fault가 나면 프로세스가 죽는 구조였습니다. 이 프로젝트에서는 가상메모리를 구현하고 하나의 프로세스가 물리메모리를 다쓰는 것 같은 착각을 주도록 하겠습니다.

Page

page는 가상메모리 상에서의 page를 의미합니다. page는 page 크기 단위로 메모리에 맵핑되는 방식으로 동작합니다. pintos에서는 page 구조체를 만들어서 page 구조와 동작을 제어합니다.

struct page {
  const struct page_operations *operations;
  void *va;              /* Address in terms of user space */
  struct frame *frame;   /* Back reference for frame */

  union {
    struct uninit_page uninit;
    struct anon_page anon;
    struct file_page file;
#ifdef EFILESYS
    struct page_cache page_cache;
#endif
  };
};

page는 크게 VM_UNINIT, VM_ANON, VM_FILE 3가지 타입으로 구분됩니다. 모든 페이지는 맨 처음 생성될 때는 unint 타입입니다. 그리고 추후에 page fault가 날 때 그때 가서야 anon, file 둘 중 하나로 갱신됩니다.

Supplemental Page Table

핀토스에서는 페이지의 추가적인 정보를 담기 위한 Supplemental Page Table을 구현해야합니다. 맨 처음에 생성된 Page는 이 Supplemental Page Table에 들어갑니다. 처음에 unint 상태의 페이지를 Supplemental Page Table에 넣고 추후에 Page Fault가 발생했을때 그때가서 Supplemental Page Table에 있는 페이지를 가져와 필요한 작업을 처리해줍니다.

Frame

가상 메모리에 page가 있다면 이에 맵핑되는 물리메모리 단위로 frame이 있습니다. 사실 물리메모리에서도 page라고 하는데, 핀토스에서는 이를 명확하게 구분하기 위해 frame이라는 말을 사용했습니다. page가 맨처음 생성될 시, 해당 페이지에 맵핑되어 있는 frame은 없습니다. 하지만 추후에 해당 페이지에서 page fault가 발생하고 유효성 검사가 통과되고 나면 그때가서 그에 해당하는 frame을 할당해 줍니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글