spt_find_page() - sihyun10/pintos-lab-vm GitHub Wiki
๐ ๏ธ ๋ ๋ฒ์งธ ๋ชฉํ - spt_find_page()
ํจ์๋ฅผ ๊ตฌํ
struct page *spt_find_page(struct supplemental_page_table *spt, void *va);
spt_find_page()
๋ ์ฃผ์ด์ง ๊ฐ์ ์ฃผ์(va
)์ ๋์๋๋ ํ์ด์ง๊ฐ supplemental page table
(SPT)์ ์กด์ฌํ๋์ง ์ฐพ์ ๋ฐํํ๋ ํจ์์ด๋ค.
๊ตฌํ
#include "vm/vm.h"
#include "threads/mmu.h" // for pg_round_down()
struct page *
spt_find_page(struct supplemental_page_table *spt, void *va)
{
// ๋น๊ต์ฉ ๋๋ฏธ ๊ฐ์ฒด ๋ง๋ฌ
struct page dummy_page;
dummy_page.va = pg_round_down(va); // ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ถ์ va๋ก ์ค์
struct hash_elem *e = hash_find(&spt->spt_hash, &dummy_page.hash_elem);
if (e == NULL)
return NULL;
return hash_entry(e, struct page, hash_elem);
}
๐ง ์ pg_round_down()์ ์ฌ์ฉํ๋ ์ด์ ? - ํ์ด์ง ๋จ์ ์ ๋ ฌ ๋๋ฌธ์ด๋ค.
// ๊ฐ์์ฃผ์ va๋ฅผ ํ์ด์ง ์์ ์ฃผ์๋ก ๋ด๋ฆผ
#define pg_round_down(va) (void *) ((uint64_t) (va) & ~PGMASK)
๊ฐ์ ์ฃผ์ va๋ฅผ ํด๋นํ๋ ํ์ด์ง์ ์์ ์ฃผ์๋ก ๋ด๋ฆผ(round_down) ํด์ฃผ๋ ๋งคํฌ๋ก์ด๋ค.
์ด๊ฑธ ์ฌ์ฉํ๋์ด์ ๋, ํ์ด์ง ํ
์ด๋ธ์์ ํ์ด์ง๋ฅผ ์ฐพ๊ฑฐ๋ ์ ์ฅํ ๋๋ ํ์ด์ง ๊ธฐ์ค ์ฃผ์๋ฅผ ํค๋ก ์ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ง ์ ํ์ด์ง์ ์์ ์ฃผ์๋ฅผ ํค๋ก ์จ์ผํ ๊น? โ ๊ฐ์ ํ์ด์ง๋ฅผ ๊ฐ์ ๊ฑธ๋ก ์ธ์ํ๊ฒ ํ๋ ค๋ฉด ๋ญ๊ฐ ๊ฐ์์ผํ ๊น? ์ ๋ํ ์ด์ผ๊ธฐ์ด๋ค.
์ด๋ค ์ฃผ์ va = 0x8048123 ๊ฐ ์์ ๋,
โ์ด ์ฃผ์๊ฐ ์ํ ํ์ด์ง๋ฅผ ์ฐพ๊ณ ์ถ์ด!โ
๊ทผ๋ฐ ์ด ์ฃผ์๊ฐ์ ๋จ ํ๋์ ์กฐ๊ฐ์ผ ๋ฟ์ด๋ค.
์ด๊ฑธ ๊ทธ๋๋ก ํด์ ํ
์ด๋ธ์ ์ฐ๋ฉด, ๋ค๋ฅธ ์กฐ๊ฐ๋ค์ด๋ ๋ค๋ฅธ ์ฃผ์๋ก ์ธ์๋๋ค. (์ฆ ๋ค ๋ค๋ฅธ ํ์ด์ง๋ก ์ฐฉ๊ฐํจ)
ํ์ง๋ง ์ด ์กฐ๊ฐ๋ค์ ๋ชจ๋ ๊ฐ์ ํ์ด์ง์ ์๋ค.
| ํด๊ฒฐ๋ฒ : ํ์ด์ง์ ์์ ์ฃผ์๋ก ๋ง์ถฐ์ ๋น๊ต!
- ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ถ์๊ฑด โ๊ฐ์ ํ์ด์งโ์ ์๋์ง์ ์ฌ๋ถ๋๊น,
- ์ฃผ์๋ฅผ ํ์ด์ง์ ์์ ์ฃผ์์ธ 0x8048000์ผ๋ก ๋ง์ถฐ์ผ
- 0x8048123, 0x8048FFF, 0x8048000๋ ๊ฐ์ ํค๋ก ์ธ์๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ ํ์ด์ง๋ฅผ ํ๋์ ํค๋ก ๊ด๋ฆฌํ ์์๋ค.
struct hash_elem *e = hash_find(&spt->spt_hash, &dummy_page.hash_elem);
hash_find()
๋ ํด์ ํ ์ด๋ธ์์struct hash_elem*
๋ฅผ ํตํด ํญ๋ชฉ์ ์ฐพ๋๋ค.va
๊ฐ ๊ฐ์page
๋ฅผ ์ฐพ๊ธธ ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
return hash_entry(e, struct page, hash_elem);
- ๋์๋๋ ํ์ด์ง๊ฐ
supplemental page table
(SPT)์ ์กด์ฌํ๋ค๋ฉดhash_entry()
๋ฅผ ํตํด, hash_elem *
์ ํฌํจํ ์์ ๊ตฌ์กฐ์ฒด์ธstruct page *
๋ฅผ ๋ค์ ์ถ์ถํด์ค๋ค.