기존 pintos 메모리 문제점
PML4를 가진 기존의 핀토스는 가상메모리와 물리메모리가 바로 맵핑되어 있다.
기존 핀토스 메모리 탑재 과정
이 페이지 테이블에 맵핑된 물리주소는 다른 프로세스와 같은 곳을 가리킬 수 있고 이럴 때 page fault가 된다. 그리고 한번 맵핑되면 물리메모리에서 항상 공간을 차지하기에 효율적인 메모리 관리가 되지 않는다.
목표
Supplemental Page Table
을 추가하고 페이지에 추가적인 정보를 저장하여 효율적인 메모리 관리를 할 수 있게 하는 것이 목표이다.
Supplemental Page Table
를 참조하여 해제할 리소스를 결정한다.Supplemental Page Table(SPT 구현)
자료구조 선택
테이블을 구현하기 위해 자료구조를 먼저 선택한다.
추천하는 자료구조 4가지 중에 Hash table 선택
Hash table관련 자료 https://mangkyu.tistory.com/102
page
를 찾아야할 때 빠르게 접근할 수 있음struct supplemental_page_table{
struct hash hash;
};
struct page
{
const struct page_operations *operations;
void *va; /* Address in terms of user space */
struct frame *frame; /* Back reference for frame */
/* Your implementation */
struct hash_elem hash_elem; /* Hash table element. */
struct file_information *file_inf;
bool writable;
union
{
struct uninit_page uninit;
struct anon_page anon;
struct file_page file;
#ifdef EFILESYS
struct page_cache page_cache;
#endif
};
};
va
키가 되는 가상주소frame
물리 주소랑 맵핑되는 frame 저장struct uninit_page {
/* Initiate the contets of the page */
vm_initializer *init;
enum vm_type type;
void *aux;
/* Initiate the struct page and maps the pa to the va */
bool (*page_initializer) (struct page *, enum vm_type, void *kva);
};
page fault 시 page_initializer에 저장된 init 함수 호출됨구현 코드
struct page *
spt_find_page(struct supplemental_page_table *spt UNUSED, void *va UNUSED)
{
struct page *page = page_lookup(va);
}
///////
struct page *
page_lookup(const void *address)
{
struct page p;
struct hash_elem *e;
p.va = pg_round_down(address);
e = hash_find(&thread_current()->spt.hash, &p.hash_elem);
return e != NULL ? hash_entry(e, struct page, hash_elem) : NULL;
}
void supplemental_page_table_init(struct supplemental_page_table *spt UNUSED)
{
hash_init(&spt->hash, page_hash, page_less, NULL);
}
bool spt_insert_page(struct supplemental_page_table *spt UNUSED,
struct page *page UNUSED)
{
int succ = false;
if (!hash_insert(&spt->hash, &page->hash_elem))
{
succ = true;
}
return succ;
}
PintOS Project3 GIthub 주소 PintOS