[PintOS] Virtual Memory - ๋ค์ด๊ฐ๊ธฐ(Project 3, TIL)
Virtual Memory๋ ์ ํ์ํ ๊น?
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์. ์์ ์ฌ์ ํ๋ ์ด์ด์ ๊ฒ์ ํ๋ก์ธ์ค์์ ๊ฐ์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ฐ๊ฐ ์ฌ์ ์๊ฐ๊ณผ ์บ๋ฆญํฐ์ ์ฒด๋ ฅ ์ ๋ณด๊ฐ ๋ด๊ธฐ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ๊ณ ํ ๋๋ง๋ค ์๋ก์ ํ๋ก์ธ์ค์์ ์ฌ์ฉํ๋ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ์๋์น ์๊ฒ ์บ๋ฆญํฐ์ ์ฒด๋ ฅ์ด ์ ์ ์ฆ๊ฐํ๋ค๋๊ฐ, ์บ๋ฆญํฐ์ ์ฒด๋ ฅ์ด ๋ณ์ ๋ ์์ ์ฌ์ ์๊ฐ์ด ๋ค๋ก ์ด๋ํ๋ค๋๊ฐ ๐.
Virtual Memory๋ฅผ ๋์ ํด ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ๊ฐ ํ๋ก์ธ์ค๋ Virtual Memory ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ์ ํ๋ก์ธ์ค๋ณ ๊ฐ์ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค ํ๋๋ผ๋ ์ค์ ๋ฌผ๋ฆฌ Memory(RAM)์ ๋งคํ๋์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๋ค๋ฅด๊ฒ ๋๋ค! ์ด๋ data security ์ธก๋ฉด์์์ Virtual Memory ์ฅ์ ์ด๋ค.
๋ํ, 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)์์ ์ฃผ์ ๋ณํ์ ์ํด ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ํ์ด์ง ํ ์ด๋ธ์ ํ์ด์ง ๋ฒํธ๋ฅผ ํ๋ ์ ๋ฒํธ๋ก ๋ฐ๊ฟ
์ฃผ์ ๋ณํ
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ 64๋ฐ์ดํธ, ํ์ด์ง์ ํฌ๊ธฐ๋ 16๋ฐ์ดํธ๋ก ๊ฐ์ ํ๋ค. ์ด๋, ๊ฐ์ ์ฃผ์๊ฐ 10์ง์๋ก 21์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด..
- ๊ฐ์ ์ฃผ์ : 010101(2์ง์)
- VPN(์์ 2๋นํธ) : 01 โถ๏ธ 1(10์ง์)
- ์คํ์
(ํ์ 4๋นํธ) : 0101
์์ ๊ฐ์ด ๊ณ์ฐ๋๋ค.
AS-IS
TO-BE
๊ตฌํ
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 ์ ๋ฆฌ์์