๐Ÿงญ KAIST JUNGLE/Pintos

[PintOS] Virtual Memory - ๋“ค์–ด๊ฐ€๊ธฐ(Project 3, TIL)

seungineer = seungwoo + engineer 2024. 5. 19. 03:27

Virtual Memory๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

But, what is Virtual Memory?(youtube)

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์ž. ์Œ์•… ์žฌ์ƒ ํ”Œ๋ ˆ์ด์–ด์™€ ๊ฒŒ์ž„ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ™์€ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๊ฐ๊ฐ ์žฌ์ƒ ์‹œ๊ฐ„๊ณผ ์บ๋ฆญํ„ฐ์˜ ์ฒด๋ ฅ ์ •๋ณด๊ฐ€ ๋‹ด๊ธฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ๊ณ ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋กœ์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉํ•˜๋˜ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์˜๋„์น˜ ์•Š๊ฒŒ ์บ๋ฆญํ„ฐ์˜ ์ฒด๋ ฅ์ด ์ ์  ์ฆ๊ฐ€ํ•œ๋‹ค๋˜๊ฐ€, ์บ๋ฆญํ„ฐ์˜ ์ฒด๋ ฅ์ด ๋‹ณ์„ ๋•Œ ์Œ์•… ์žฌ์ƒ ์‹œ๊ฐ„์ด ๋’ค๋กœ ์ด๋™ํ•œ๋‹ค๋˜๊ฐ€ ๐Ÿ™„.

But, what is Virtual Memory?(youtube)

Virtual Memory๋ฅผ ๋„์ž…ํ•ด ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” Virtual Memory ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ์— ํ”„๋กœ์„ธ์Šค๋ณ„ ๊ฐ™์€ ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค ํ•˜๋”๋ผ๋„ ์‹ค์ œ ๋ฌผ๋ฆฌ Memory(RAM)์— ๋งคํ•‘๋˜์–ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์€ ๋‹ค๋ฅด๊ฒŒ ๋œ๋‹ค! ์ด๋Š” data security ์ธก๋ฉด์—์„œ์˜ Virtual Memory ์žฅ์ ์ด๋‹ค.

But, what is Virtual Memory?(youtube)

๋˜ํ•œ, RAM ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ๋•Œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค. ๊ฐ€์žฅ ์™ผ์ชฝ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด RAM์— Mapping ๋˜์ง€ ๋ชปํ•œ ์ฃผ์†Œ์˜ ๊ฒฝ์šฐ DISK๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ํ”„๋กœ์„ธ์Šค์—์„œ ๋งคํ•‘ํ•˜๊ณ ์ž ํ•  ๋•Œ, RAM์— swap ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋˜ ํ•œ ๊ฐ€์ง€์˜ ์žฅ์ ์€ Memory Fragmentation ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ค‘๊ฐ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ RAM์— ๊ฒŒ์ž„ Process๊ฐ€ load ๋˜์–ด ์œ„์•„๋ž˜๋กœ ๊ฐ๊ฐ 1GB ์ €์žฅ๊ณต๊ฐ„๋งŒ ๋‚จ์€ ์ƒํƒœ์—์„œ ์‚ฌ์ง„ ์—๋””ํŒ… Process๋ฅผ ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋ฉด, ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด load ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์„ loadํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ Process์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” library๋Š” ๊ฐ™์€ ๋ฌผ๋ฆฌ Memory ์ฃผ์†Œ์— ์œ„์น˜์‹œ์ผœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ Process๋ณ„๋กœ ๋”ฐ๋กœ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฌผ๋ฆฌ Memory์— ์œ„์น˜์‹œํ‚จ๋‹ค๋ฉด ๊ณตํ†ต๋˜๋Š” ์ •๋ณด๋กœ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„๋„ ์ƒ๋‹นํ•  ๊ฒƒ์ธ๋ฐ, ์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.(์ด๋ฏธ์ง€ ์ถœ์ฒ˜: ์ฐธ๊ณ  ์˜์ƒ)

์ด๋ ‡๊ฒŒ ๊ธฐ๋˜ฅ์ฐจ๊ณ  ์œ ์šฉํ•œ Virtual Memory๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

Memory Terminology

Project3์—์„œ๋Š” ์šฉ์–ด์— ๊ด€ํ•œ ์„ค๋ช…์„ ์ž์„ธํžˆ ํ•œ๋‹ค. ์ƒ์†Œํ•œ ๊ฐœ๋…์ด ์žˆ์œผ๋ฏ€๋กœ ์ˆ™์ง€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

  • Pages(ํŽ˜์ด์ง€, a.k.a ๊ฐ€์ƒ ํŽ˜์ด์ง€)
    • 4,096 ๋ฐ”์ดํŠธ(ํŽ˜์ด์ง€ ํฌ๊ธฐ)์˜ ๊ธธ์ด(OS๋ณ„ ์ƒ์ดํ•˜๋‚˜ Pintos์—์„œ๋Š” 4kb)
    • ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์—ฐ์†๋œ ์˜์—ญ
    • ๋ฐ˜๋“œ์‹œ ์ •๋ ฌ ์ •์ฑ…์— ๋”ฐ๋ผ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ
    • 64๋น„ํŠธ ๊ฐ€์ƒ ์ฃผ์†Œ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ 12๋น„ํŠธ๋Š” '์˜คํ”„์…‹'
  • Frames(ํ”„๋ ˆ์ž„, a.k.a ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„, ํŽ˜์ด์ง€ ํ”„๋ ˆ์ž„)
    • ํŽ˜์ด์ง€์™€ ๊ธธ์ด ๋™์ผํ•ด์•ผ ํ•จ(์ •๋ ฌ ์ •์ฑ… ๋”ฐ๋ฆ„)
    • ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์—ฐ์†์ ์ธ ์˜์—ญ
    • ๋™์ผํ•˜๊ฒŒ ๋งˆ์ง€๋ง‰ 12๋น„ํŠธ๋Š” '์˜คํ”„์…‹'

  • Page Tables(ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”)
    • ํŽ˜์ด์ง€(๊ฐ€์žฅ ์ฃผ์†Œ) โžก๏ธ ํ”„๋ ˆ์ž„(๋ฌผ๋ฆฌ ์ฃผ์†Œ)
    • CPU์˜ MMU(์ •ํ™•ํžˆ Page Table Base Register, PTBR)์—์„œ ์ฃผ์†Œ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
    • ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์€ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊ฟˆ

์ฃผ์†Œ ๋ณ€ํ™˜

But, what is Virtual Memory?(youtube), โš ๏ธ 32๋น„ํŠธ ๊ธฐ์ค€ ์„ค๋ช…

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋Š” 64๋ฐ”์ดํŠธ, ํŽ˜์ด์ง€์˜ ํฌ๊ธฐ๋Š” 16๋ฐ”์ดํŠธ๋กœ ๊ฐ€์ •ํ•œ๋‹ค. ์ด๋•Œ, ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ 10์ง„์ˆ˜๋กœ 21์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด..

- ๊ฐ€์ƒ ์ฃผ์†Œ : 010101(2์ง„์ˆ˜)
- VPN(์ƒ์œ„ 2๋น„ํŠธ) : 01 โ–ถ๏ธ 1(10์ง„์ˆ˜)
- ์˜คํ”„์…‹(ํ•˜์œ„ 4๋น„ํŠธ) : 0101

์œ„์™€ ๊ฐ™์ด ๊ณ„์‚ฐ๋œ๋‹ค.

AS-IS

Project2๊นŒ์ง€์˜ ๊ฐ€์ƒ์ฃผ์†Œ mapping

TO-BE

page fault ๋ฐœ์ƒ ํ›„ DISK์— ์žˆ๋Š” ์ •๋ณด๋ฅผ read ํ•˜์—ฌ ์ƒˆ๋กœ์šด page๋ฅผ install!

 

๊ตฌํ˜„

Memory Manangement

- page structure and operations

- Implement Supplemental Page Table

๐Ÿ”จ ๋””๋ฒ„๊น…

vm_do_claim_page()

VA์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€์™€ ๋”๋ถˆ์–ด ํ”„๋ ˆ์ž„์„ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ is_writable() ํ•จ์ˆ˜๋กœ writable ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, writable์„ ๋ณด๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ์„ ๋ช…ํ™•ํžˆ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ์–ด์ฒ˜๊ตฌ๋‹ˆ ์—†๋Š” ์‹ค์ˆ˜๋ฅผ ํ•˜๊ฒŒ ๋๋‹ค. ์š”์•ฝํ•˜์ž๋ฉด, page๋ฅผ setํ•˜๊ณ ์ž ํ•˜๋Š” ๊ณณ์˜ 'page์˜ writable'์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ˜„์žฌ thread์˜ pml4๊ฐ€ writableํ•œ์ง€๋ฅผ ํ™•์ธํ–ˆ๋‹ค.. ๋””๋ฒ„๊น… ํ›„์—์•ผ ํ—ˆ๋ฌดํ–ˆ์ง€๋งŒ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ์–ด๋–ค ๋ถ€๋ถ„์ด ์ž˜๋ชป ๋“ค์–ด๊ฐ€์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ธ์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

static bool
vm_do_claim_page(struct page *page) {  // va ํŽ˜์ด์ง€๋ฅผ๋งŒ๋“ค๊ณ  ํ”„๋ ˆ์ž„์— ํ• ๋‹นํ•œ ํŽ˜์ด์ง€
    struct frame *frame = vm_get_frame();

    /* Set links */
    frame->page = page;
    page->frame = frame;

    struct thread *current = thread_current();
    // bool writable = is_writable(current->pml4); <- ๊ธฐ์กด
    // pml4_set_page(current->pml4, page->va, frame->kva, writable); <- ๊ธฐ์กด, ์•„๋ž˜๊ฐ€ ์ˆ˜์ •
    pml4_set_page(current->pml4, page->va, frame->kva, page->writable);

    return swap_in(page, frame->kva);
}

๐Ÿ’ก ํ•ด๊ฒฐ ๊ฒฝ์œ„, Lessoned learn ์ •๋ฆฌ์˜ˆ์ •