์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- c#
- ์๊ณ ๋ฆฌ์ฆ
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ํํ ์ค
- ๋ค์ต์คํธ๋ผ
- kraftonjungle
- Unity
- pintos
- ํฌ๋ํํค ์ ๊ธ
- ํฌ๋ํํค์ ๊ธ
- ์ค๋ธ์
- anonymous page
- KRAFTON JUNGLE
- ๋คํธ์ํฌ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- TiL
- project3
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- ์ ์-์ ํฌ
- BFS
- 4๊ธฐ
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- User Stack
- C
- ํ์ด์ฌ
- ๋ฐฑ์ค
- ์ ๋ํฐ
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK10 DAY 80 - PintOS Project3 VM (Memory Management ) ๋ณธ๋ฌธ
ํฌ๋ํํค ์ ๊ธ WEEK10 DAY 80 - PintOS Project3 VM (Memory Management )
habbn 2024. 3. 27. 21:26๐2024.03.27
1. PintOS Project3 VM (Memory Management)
Implement Supplemental Page Table
: ๊ฐ ํ์ด์ง์ ๋ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ ๋ณด์ถฉ ํ์ด์ง ํ ์ด๋ธ์ ๊ตฌํํด์ผ ํ๋ค.
/* ์ ๋ณด์กฐ ํ์ด์ง ํ
์ด๋ธ์ ์ด๊ธฐํํฉ๋๋ค. */
void
supplemental_page_table_init (struct supplemental_page_table *spt UNUSED) {
hash_init(&spt->hash_table, page_hash, page_less, NULL);
}
struct page *
spt_find_page (struct supplemental_page_table *spt UNUSED, void *va UNUSED) {
struct page *page = NULL;
struct hash_elem *e;
/* ํ ์ผ: ์ด ํจ์๋ฅผ ์ฑ์์ฃผ์ธ์. */
page->va = pg_round_down(va);
e = hash_find(&spt->hash_table, &page->hash_elem);
if(e != NULL)
return hash_entry(e, struct page, hash_elem);
else
return NULL;
}
/* Insert PAGE into spt with validation. */
/* ํ์ด์ง๋ฅผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑฐ์ณ spt์ ์ฝ์
ํฉ๋๋ค. */
bool
spt_insert_page (struct supplemental_page_table *spt UNUSED, struct page *page UNUSED) {
int succ = false;
/* ํ ์ผ: ์ด ํจ์๋ฅผ ์ฑ์์ฃผ์ธ์. */
if(is_user_vaddr(page->va)){
if(spt_find_page(spt, page->va) == NULL){
hash_insert(&spt->hash_table, &page->hash_elem);
succ = true;
}
}
return succ;
}
Frame Management
static struct frame *
vm_get_frame (void) {
struct frame *frame = malloc(sizeof(struct frame));
if(frame == NULL){
PANIC("todo");
}
/* ํ ์ผ: ์ด ํจ์๋ฅผ ์ฑ์์ฃผ์ธ์. */
frame->kva = palloc_get_page(PAL_USER | PAL_ZERO);
if(frame->kva == NULL){
free(frame);
return vm_evict_frame();
}
frame->page = NULL;
ASSERT (frame != NULL);
ASSERT (frame->page == NULL);
return frame;
}
bool
vm_claim_page (void *va UNUSED) {
struct page *page = NULL;
/* ํ ์ผ: ์ด ํจ์๋ฅผ ์ฑ์์ฃผ์ธ์. */
page = spt_find_page(&thread_current()->spt, va);
if(page == NULL)
return false;
return vm_do_claim_page(page);
}
/* Claim the PAGE and set up the mmu. */
/* ํ์ด์ง๋ฅผ ์ฒญ๊ตฌํ๊ณ mmu๋ฅผ ์ค์ ํฉ๋๋ค. */
static bool
vm_do_claim_page (struct page *page) {
struct frame *frame = vm_get_frame ();
/* Set links */
/* ๋งํฌ ์ค์ */
frame->page = page;
page->frame = frame;
/* TODO: Insert page table entry to map page's VA to frame's PA. */
/* ํ ์ผ: ํ์ด์ง ํ
์ด๋ธ ํญ๋ชฉ์ ์ฝ์
ํ์ฌ ํ์ด์ง์ VA๋ฅผ ํ๋ ์์ PA์ ๋งคํํฉ๋๋ค. */
if(pml4_get_page(thread_current()->pml4, page->va) == NULL){
if (!pml4_set_page (thread_current ()->pml4, page->va, frame->kva, true)) {
vm_dealloc_page (page);
return false;
}
}
return swap_in (page, frame->kva);
}
์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ๋ฉด์ ์๋ฌ๋ฌ๋ ๋ถ๋ถ์ ๋ํด ์ ๋ฆฌํด๋ดค๋ค.
์ฐ์ hash_init() ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์๋ก ์ค hash_hash_func์ hash_less_func ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๊ทธ๋์ ์ด์ ๊ฐ์ด ํจ์๋ฅผ ์ถ๊ฐํด์คฌ๋๋ฐ ์๊พธ ์ฌ์ ์ธ๋์๋ค๋ ์๋ฌ๊ฐ ๋ด์๋ค.
uint64_t hash_hash_func (const struct hash_elem *e, void *aux)
{
const struct page *p = hash_entry(e, struct page, hash_elem);
return hash_bytes(&p->va, sizeof p->addr);
}
bool hash_less_func (const struct hash_elem *a, const struct hash_elem *b, void *aux)
{
const struct page *pa = hash_entry(a, struct page, hash_elem);
const struct page *pb = hash_entry(b, struct page, hash_elem);
return pa->va < pb->va;
}
ํ๋ํ๋ ์ฐจ๊ทผ์ฐจ๊ทผํด๋ณด๋ ์๋ก์ด ํจ์๋ฅผ ์ ์ํด์ค ๊ฒ์ด ์๋ hash_hash_func์ hash_less_func๋ผ๋ ํจ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ ์๋ฅผ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด์๋ค.
์์ฐจ์ฐจ..!
uint64_t page_hash (const struct hash_elem *e, void *aux)
{
const struct page *p = hash_entry(e, struct page, hash_elem);
return hash_bytes(&p->va, sizeof p->va);
}
bool page_less (const struct hash_elem *a, const struct hash_elem *b, void *aux)
{
const struct page *pa = hash_entry(a, struct page, hash_elem);
const struct page *pb = hash_entry(b, struct page, hash_elem);
return pa->va < pb->va;
}
๊น๋ถ์์๋ page_hash์ page_less ๋ผ๊ณ ์ ํ์์์ง๋ง ๋์ ๊ฐ๊ณผํ ์ค์์๋ค..
page_hash() ํจ์์ ์ญํ ?
ํด์ํ ์ด๋ธ์์๋ ํน์ ํค๋ฅผ ํด์๊ฐ์ผ๋ก ๋ณํํ์ฌ ํด๋น ํด์๊ฐ์ ๋์ํ๋ ๋ฒํท์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. ์ด๋ฅผ ์ํด ํค์ ํด์๊ฐ์ ๊ณ์ฐํ๋ ํจ์๊ฐ ํ์ํ๋ค.
hash_byte ํจ์๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ๋ํ ํด์๊ฐ์ ๊ณ์ฐํ๋ค. ์ฃผ์์ ํฌ๊ธฐ๋ฅผ ์ธ์๋ก ๋ฐ์ ํ์ด์ง ์ฃผ์๋ฅผ ํด์๊ฐ์ผ๋ก ๋ณํํ๋ค.
page_less() ํจ์์ ์ญํ ?
๋น๊ตํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ํ ์ด๋ธ์ ์์ฑํ๋ฉด, ํน์ ๊ฐ์ ์ฃผ์์ ๋ํ ํ์ด์ง๋ฅผ ํด์ ํ ์ด๋ธ์ ์ฝ์ ํ๊ฑฐ๋ ๊ฒ์ํ ๋ ํ์ด์ง์ ๊ฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ด์ง๋ฅผ ์ ๋ ฌํ ์ ์๋ค.
typedef uint64_t hash_hash_func (const struct hash_elem *e, void *aux);
typedef bool hash_less_func (const struct hash_elem *a, const struct hash_elem *b, void *aux);
hash_hash_func ํจ์ ํฌ์ธํฐ๋ ํด์ ํ ์ด๋ธ์์ ์์๋ฅผ ํด์ฑํ๋๋ฐ ์ฌ์ฉ๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ,
hash_less_func ํจ์ ํฌ์ธํฐ๋ ํด์ ํ ์ด๋ธ์์ ์์๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด๋ฌํ ํจ์ ํฌ์ธํฐ ํ์ ์ ์ ์ํจ์ผ๋ก์จ, ์์ ๋ง์ ํด์ ํจ์์ ๋น๊ต ํจ์๋ฅผ ๊ตฌํํ์ฌ ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ผ ํ๋ค.