본문 바로가기
정글/pintos

[Project3] Virtual Memory(2) - Memory Management

by 위대한초밥V 2023. 6. 14.

Memory Management

가상 메모리 시스템을 사용하려면, virtual page와 physical frame을 잘 다뤄야 한다. 즉, virtual 또는 physical 메모리 영역이 누구에게, 왜, 사용되고 있는지 확인해야 한다.

이번 과제에서는 SPT(Supplemental page table)를 학습하고, 실제 프레임을 다룰 것이다. 또한 virtual page에는 page라고 하고, physical page는 frame이라고 용어를 사용한다.

 

Page Structure ans Operations

struct page

include/vm/vm.h 에 작성된 page 는 virtual memory를 나타내는 페이지 구조체이다.

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

	/* Per-type data are binded into the union. */
	/* Each function automatically detects the current union */
  union {
    struct uninit_page uninit;
    struct anon_page anon;
    struct file_page file;
#ifdef EFILESYS
    struct page_cache page_cache;
#endif
  };
};

앞으로 공부할 page operation과 virtual address, physical frame이 있다.

또한 union field가 있다. union은 메모리 영역에 서로 다른 유형의 데이터를 저장할 수 있는 데이터 유형으로, 한번에 하나의 멤버만 값을 포함할 수 있다. 즉, page 구조체가 uninit_page, anon_page, file_page, cache_page일 수 있다.

예를 들어 익명 페이지라면, page 구조체는 struct anon_page anon을 멤버로 갖고, anon_page에는 익명 페이지에 보관해야하는 필수 정보가 포함된다.

 

Page Operations

위에서 설명한 것처럼, page는 VM_UNINIT, VM_ANON, VM_FILE이 될 수 있다. 페이지는 swapping in, swapping out, 페이지 삭제 등 여러 작업을 수행할 수 있다.

페이지 유형에 따라 처리 방식이 달라진다. 즉, VM_ANON 페이지를 삭제하는 함수와 VM_FILE 페이지를 삭제하는 함수는 달라야 한다.

이를 처리하기 위해 객체 지향 프로그래밍의 “class inheritance”(클래스 상속) 개념이 사용된다. C 프로그래밍 언어에는 “class”나 “inheritance”라는 개념이 따로 없지만, Linux 같은 실제 운영 체제 코드에서 funtion pointer를 이용해서 구현한다.

 

함수 포인터는 정의된 함수는 프로그램이 실행될 때 메인 메모리에 올라간다는 점을 이용해, 함수의 시작 주소를 가리키는 포인터 상수를 함수 포인터(function pointer)라고 한다.

함수 원형에 대한 함수 포인터는 void (*ptr_func)(int, int) 로 나타내고 ptr_func 부분은 연산자 우선순위에 의해 괄호로 둘러싸야 정상 동작한다. 함수 포인터는 런타임 시, 값에 따라 특정 함수를 호출하여 검사 없이 실행할 수 있다.

본 실습에서는 destory(page) 를 호출하면, 컴파일러에서 올바른 함수 포인터를 호출하여 page type에 맞는 페이지 제거 방식을 선택할 것이다.

Function Pointer in C - GeeksforGeeks

 

Function Pointer in C - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

코딩교육 티씨피스쿨

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

include/vm/vm.h에 있는 페이지 연산 구조체 page_operations를 확인하면 3개의 함수 포인터를 갖는 함수 테이블이 연상된다.

page_operation 구조체와 관련된 것을 하나씩 살펴보자.

  • include/vm/vm.h
    • 위에서 확인한 page 구조체에서 operations라는 이름의 필드를 확인할 수 있다.
  • vm/file.c 
    • file_ops 구조체에서 page_operations를 확인할 수 있다.
    • 파일처리와 관련된 함수 모음이다.
      • .destory : 페이지를 삭제하는 함수로, 같은 파일에 정의된 file_baked_destory 값이 있다.
static const struct page_operations file_ops = {
	.swap_in = file_backed_swap_in,
	.swap_out = file_backed_swap_out,
	.destroy = file_backed_destroy,
	.type = VM_FILE,
};

 

함수 포인터 인터페이스로  file_backed_destroy 가 어떻게 호출되는지 알아보자.

  • vm_dealloc_page(page) (vm/vm.c)가 호출된다. 이 페이지가 파일 백업 페이지(VM_FILE)라고 가정하며, 함수 내부에서는 destroy(page)를 호출한다.
  • destroy(page)  include/vm/vm.h 에 매크로로 정의되어 있다.
#define destroy(page) if ((page)->operations->destroy) (page)->operations->destroy (page)
  • destroy 함수를 확인해보면 (page) → operations → destory 과정으로 호출한다는 것을 확인할 수 있다.
  • 이 페이지는 VM_FILE 페이지이므로 .destroy 필드는 file_backed_destroy를 가리킨다.

이러한 과정을 거쳐 file-backed page가 삭제된다.

 

Implement Supplemental Page Table

pintos는 페이지 테이블(pml4)로 virtual memory와 physical memory 맵핑을 관리한다.

앞에서 설명한 것처럼 이것만으로 부족하기 때문에 supplementary page table(SPT)가 나왔고, SPT는 페이지 오류 및 리소스 관리를 처리하기 위해 각 페이지의 추가 정보를 저장한다.

프로젝트 3에서는 SPT 기본 기능을 구현한다.

SPT 관련 함수들은 vm/vm.c 에 있다.

첫째로 Pintos의 SPT를 설계하고, 설게한 것에 맞춰 다음 함수들을 구현한다.

void supplemental_page_table_init (struct supplemental_page_table *spt);

SPT를 초기화한다. SPT에서 사용한 데이터 구조를 결정한다.

이 함수는  initd(userprog/process.c)를 호출하여 새 프로세스를 시작하거나 __do_fork (userprog/process.c)를 호출해 프로세스가 fork될 때 호출된다.

 

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

주어진 SPT 테이블에서 va에 해당하는 구조체 페이지를 찾는다. 실패한다면 NULL을 반환한다.

 

bool spt_insert_page (struct supplemental_page_table *spt, struct page *page)

SPT 테이블에 page 구조체를 추가한다.

  • 가상 주소 테이블에 이미 다른 주소가 등록되어 있는지 확인한다.

Frame Management

메모리가 생성시점에 나온 메타 데이터 뿐만 아니라 데이터들도 관리해야 한다. include/vm/vm.h 를 확인하면 물리 메모리를 나타내는 여러 구조체 프레임을 확인할 수 있다.

/* The representation of "frame" */
struct frame {
	void *kva;
	struct page *page;
};
  • kva : kernel virtual address
  • page : page 구조체

이밖에도 frame 관리에 필요한 다른 멤버들을 추가할 수 있다.

아래의 함수들을 구현해라.

*static struct frame vm_get_frame (void);

vm_get_frame을 구현해서 모든 사용자 공간 페이지(PALLOC_USER)를 할당한다. 현재 과정에서는 페이지 할당을 실패해도 스왑 아웃을 처리할 필요 없고, PANIC(”todo”)로 처리하면 된다.

*bool vm_do_claim_page (struct page page);

물리적 프레임, 즉 페이지를 의미하는 클레임을 할당한다.

먼저 위에서 구현한 vm_get_frame 함수를 호출하여 프레임을 가져오고, MMU(Memory Management Unit)를 설정한다. 즉, 가상 주소에서 페이지 테이블의 실제 주소로 매핑한다.

반환 값은 작업 성공 여부를 의미한다.

*bool vm_claim_page(void va);

va 를 할당할 페이지를 찾는다. 먼저 페이지를 가져오고, 해당 페이지로  vm_do_claim_page 를 호출한다.

반응형