PINTOS - Memory Management

JinJinJara·2023년 10월 11일
0

PINTOS

목록 보기
7/10

Page

struct page

include/vm/vm.h에 정의되어 있는 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
  };
};
  • 멤버 : operations, virtual address, physical frame ( + union 멤버(=필드))

union 자료형

하나의 메모리 영역에 다른 타입의 데이터를 저장하는 것을 허용

  • 하나의 union은 여러 개의 멤버를 가질 수 있지만, 한 번에 멤버 중 하나의 값을 가질 수 있다.
    • union은 struct처럼 각 원소(멤버)들이 서로 다른 자료형을 가질 수 있다.
      반면, struct와 달리 union은 크기가 가장 큰 멤버의 크기만큼을 할당받아 멤버들이 그 메모리를 공유.
      즉, 한 번에 멤버 중 하나만이 그 공간을 사용
  • union 종류 : uninit_page, anon_page, file_page, page_cache
    • 페이지가 익명 페이지라면, 페이지 구조체는 struct anon_page anon 을 멤버 중 하나로 가지고 있다.
      anon_page 은 익명 페이지를 위해 우리가 기억해야 하는 필수적인 정보들을 담고 있다.

page_operations

struct page_operations {
  bool (*swap_in) (struct page *, void *);
  bool (*swap_out) (struct page *);
  void (*destroy) (struct page *); // 
  enum vm_type type;
};
  • page 가 VM_UNINIT 인 경우
#define destroy(page) 
if ((page)->operations->destroy) (page)->operations->destroy (page)
  • vm/uninit.c
static const struct page_operations uninit_ops = {
	.swap_in = uninit_initialize,
	.swap_out = NULL,
	.destroy = uninit_destroy,
	.type = VM_UNINIT,		
};

/* vm/file.c -> type = VM_FILE & .destroy = file_destroy
 * vm/anon.c -> type = VM_ANON & .destroy = anon_destroy
*/

Implement Supplemental Page Table

보충 페이지 테이블 : 각 페이지에 대한 추가적인 정보를 담고 있기 때문에, 페이지 폴트와 자원 관리를 처리 가능

  • pml4 : 가상 메모리와 물리 메모리를 매핑하는 것을 관리

supplemental_page_table_init

보조 페이지 테이블를 초기화

void supplemental_page_table_init (struct supplemental_page_table *spt);
  • initd 함수로 새로운 프로세스가 시작하거나 process.c의 __do_fork로 자식 프로세스가 생성될 때 위의 함수가 호출

spt_find_page

인자로 넘겨진 보조 페이지 테이블에서로부터 가상 주소(va)와 대응되는 페이지 구조체를 찾아서 반환
실패했을 경우 NULL를 반환

struct page *spt_find_page (struct supplemental_page_table *spt, void *va);

spt_insert_page

인자로 주어진 보조 페이지 테이블에 페이지 구조체를 삽입

bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);
  • 주어진 보충 테이블에서 가상 주소가 존재하지 않는지 검사해야 한다.

Frame Management

struct frame

/* The representation of "frame" */
struct frame {
  void *kva;
  struct page *page;
};
  • 멤버 : kva는 커널 가상 주소, page는 페이지 구조체를 담기
    (+ 멤버 추가 하기)

구현 과제

vm_get_frame

palloc_get_page 함수를 호출함으로써 유저 메모리 풀 에서 새로운 물리메모리 페이지 (프레임) 를 가져오기

static struct frame *vm_get_frame (void);
  • 반환 성공 : 프레임을 할당하고 프레임 구조체의 멤버들을 초기화한 후 해당 프레임을 반환

  • 항상 유효한 주소를 반환

  • 사용 가능한 페이지가 없을 때 즉, 사용자 풀 메모리가 가득 찬 경우에는 페이지를 제거하고 반환

vm_do_claim_page

page에 물리 메모리 프레임을 할당

bool vm_do_claim_page (struct page *page);
  • vm_get_frame 함수를 호출함으로써 프레임 하나를 얻기
  • MMU를 세팅하기
    • = 가상 주소와 물리 주소를 매핑한 정보를 페이지 테이블에 추가
  • 연산이 성공적으로 수행되었을 경우에 true를 반환하고 그렇지 않을 경우에 false를 반환

vm_claim_page

인자로 주어진 va에 페이지를 할당하고, 해당 페이지에 프레임을 할당

bool vm_claim_page (void *va);
  • 우선 한 페이지를 얻어야 하고 그 이후에 해당 페이지를 인자로 갖는 vm_do_claim_page라는 함수를 호출하기

0개의 댓글