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()

  • hash_find()๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”์—์„œ struct hash_elem*๋ฅผ ํ†ตํ•ด ํ•ญ๋ชฉ์„ ์ฐพ๋Š”๋‹ค.
  • va๊ฐ€ ๊ฐ™์€ page๋ฅผ ์ฐพ๊ธธ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
return hash_entry(e, struct page, hash_elem);

hash_entry()

  • ๋Œ€์‘๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ supplemental page table(SPT)์— ์กด์žฌํ•œ๋‹ค๋ฉด hash_entry()๋ฅผ ํ†ตํ•ด,
  • hash_elem *์„ ํฌํ•จํ•œ ์ƒ์œ„ ๊ตฌ์กฐ์ฒด์ธ struct page *๋ฅผ ๋‹ค์‹œ ์ถ”์ถœํ•ด์ค€๋‹ค.