์ด๋ฒ lab3๋ ์ง๋ ์ฃผ์ ๋ํ ํผ๋๋ฐฑ์ผ๋ก csapp ์ฑ ๊ณผ git book์ผ๋ก ์ ์ฒด์ ์ธ ๊ฐ๋ ์ ๋ชจ๋ ์ดํดํ ๋ค ์ฝ๋ฉ์ ์์ํ์๋ค. ๋ฌผ๋ก ์ฒ์์๋ ๋ฌ๊ตฌ๋ฆ ์ก๋ ์๋ฆฌ์ฒ๋ผ ์ฝํ์ง๋ง, git book์์ ๊ณ ์น๋ผ๊ณ ํ ๋ถ๋ถ์ ์ผ๋จ pintos์ todo๋ฅผ ๋ฌ์ ๋์ผ๋ฉด ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋๊ณ ์ถ๋ฐํ ์ ์์๋ค. ์ง๋ ์ฃผ ๊ณผ์ ๋ ํ์ด์ฝ๋ฉ์ ํ๋๋ฐ, ์ด๋ฒ์๋ ๋ด๊ฐ ์ดํดํ ๊ทธ๋๋ก ํผ์ ํ๋์ฝ๋ฉํ์๋ค. ํจ์๋ง๋ค printf()๋ฅผ ์ฐ์ด ๋๊ณ ์ด๋ค ์์๋ก ์๋๋๊ณ , ๋ฌด์จ ์ญํ ์ด ํ์ํ์ง ํ์ ํ๊ณ ์ ๋ ธ๋ ฅํ์๋ค. ํ์คํ ๊ฐ๋ ์ ์ดํดํ๋ฉด ์ฝ๋ฉํ๋ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๊ณ ์์ด๋์ด๋ฅผ ๋นจ๋ฆฌ ์ ์ฉ์ํฌ ์ ์์ผ๋ฉด์๋, test case์์ testํ๊ณ ์ ํ๋ ํฌ์ธํธ๋ ๋นจ๋ฆฌ ํ์ ํ ์ ์๊ณ ๋๋ฒ๊น ๋ ๋น ๋ฅด๋ค.
์ด์ด ์ข์๋ ๊ฒ, ์ผ๋จ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋์ด๊ฐ ๋ค์์ ๋ชจ๋ ๊ตฌํ์ด ๋๋๋ฉด, ํ๋์ฉ ๋์๋ฅผ ์ก์๊ฐ๋ ๋ฐฉ์์ผ๋ก ์งํํ ๊ฒ์ด ์ฑ๊ณต์ ์ด์๋ค.
virtual memory๊ฐ pintos ์ค์ ๊ฐ์ฅ ์ด๋ ต๋ค๋ ์๋ฌธ์ ๋ค์์๋๋ฐ, ๊ฑฑ์ ํ๋ ๊ฒ ๋ณด๋ค๋ ์ด๋ ต์ง๋ ์์๋ค. syscall ๋ณด๋ค ์ฝ๋ค๊ณ ์๊ฐํ๋ค. ๋ฌผ๋ก ์ง๊ธ ์ฝ๋๊ฐ ์๋ฒฝํ์ง๋ ์๋ค. ๋ค๋ฅธ ์กฐ์์ test case์๋ ์๋ edge case๋ฅผ ์๋ ค์ฃผ์๋ค... ์ผ๋จ ์ง๊ธ test case์ ๋ํด์๋ ํต๊ณผํ๋๊น... todo๋ก ๋จ๊ฒจ๋๊ณ ๋ฆฌ๋ทฐ๋ฅผ ์ฐ์...
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ๋ก๊ทธ๋จ์ ๋ง์น ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๊ณ๊ฐ ์๋ ๊ฒ์ฒ๋ผ illusion์ ๊ฐ์ง ์ ์๋ค. os์ ์ญํ ์ ์ ์ ๊ฐ ์์ฒญํ page๋ฅผ spt๋ก ๊ด๋ฆฌํ๊ณ frame์ ํตํด ์ค์ ๋ฌผ๋ฆฌ ํ์ด์ง๋ฅผ ๊ด๋ฆฌํ๋ค. ์ดํ ํ์ํ page๊ฐ ์์ผ๋ฉด frame๊ณผ pml4 ์ฐ๊ฒฐ ์์ผ์ฃผ๊ณ ,๊ฐ์ ๋ผ์์ค๋ค. process ๋ณ๋ก spt๋ฅผ ๊ฐ์ ธ์ page๋ฅผ ๊ด๋ฆฌํ๋ค. spt๋ hash ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๊ฒ ํ๋ค. ์ด์ ๊น์ง๋ palloc_user_page๋ฅผ ํตํด ๋ฉ๋ก๋ฆฌ๋ฅผ ํ ๋น ๋ฐ์์๋ค๋ฉด, ์ด์ ๋ถํฐ๋ get_frame()์ ํตํด frame ๊ตฌ์กฐ์ฒด์ ํจ๊ป ๊ด๋ฆฌ๋๋๋ก ํ๋ค.
ํ์ด์ง๋ค์ ๊ฐ type์ ๊ฐ๋๋ฐ anonymous type์ disk์ ๊ด๋ ค์๋ stack, heap, excutable ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ์ง๊ธ๊น์ง๋ load_segment()๋ฅผ ํตํด ์์ฒญ๋์๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ์์ผฐ๋ค๋ฉด, ์ง๊ธ์ page๋ง ์ ์ธํด์ฃผ๊ณ , fault๊ฐ ๋ฌ์ ๋ handler๋ฅผ ํตํด lazyload()๋ฅผ ํตํด ๋์ค์ ์ ๊ทผํ์ ๋ ๋น๋ก์ frame์ ์ฐ๊ฒฐํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ค๋ค. lazylaod๋ฅผ ํตํด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์๋ค. ์ผ๋ จ์ ๊ณผ์ ์ด ์ด๋ค ์์ผ๋ก ์ผ์ด๋๋์ง ํ์ ํ๋๊ฒ ์ค์ํ๋ค.
spt๋ฅผ copyํด ์ค ๋๋, ์ด page๊ฐ ์ด๋ฏธ load๋ ์ํ์ธ์ง, uninit ์ํ์ธ์ง ์ ๊ตฌ๋ณํด์ผ ํ๋ค. uninit ์ํ๋ผ๋ฉด ๋์ค์ load์ ํ์ํ ์ ๋ณด๋ค๋ aux๋ฅผ ์๋ก ํ ๋นํด์ ์ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค.
spt๋ฅผ killํด์ค ๋๋ type๋ง๋ค ์ญ์ ํด์ผํ ๊ฒ์ด ๋ค๋ฅธ ๊ฒ์ ์ธ์งํด์ผํ๊ณ , hash_clear()๋ฅผ ์ ์ด์ฉํด์ผํ๋ค. ์๊ฐํด๋ณด๋ฉด ๋๋ถ๋ถ ํ๋ฆ๋ค์ด templet์ผ๋ก ์ ๊ตฌํ๋์ด์์ผ๋ ์ ๋ฐ๋ผ ๊ตฌํํ๋ ๊ฒ ๊ฐ๋ค.
์ง๊ธ๊น์ง๋ stack์ผ๋ก ํ page๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ดํ์๋ stack์์ญ์์ page fault๊ฐ ๋ฐ์์, validateํ ์คํ ์์ญ์์์ ์ค๋ฅ์ธ์ง ํ์ธํ๊ณ stack memory๋ฅผ ์ถ๊ฐ๋ก ํ ๋น์ํค๋๋ก ๊ตฌํํด์ค์ผ ํ๋ค. ์ ์ ํ ๋ฒ์์ธ์ง rsp๋ฅผ ํตํด ํ์ธํ๋ ๊ณผ์ ์ด ์์๋๋ฐ ์ด ๋ถ๋ถ์ด ํท๊ฐ๋ ธ์๋ค.
fault_handler()์์, ํ ๋น๋ page์ ๋ํ ์ค๋ฅ์ธ์ง ํ์ธํ๊ณ , ๊ทธ ๋ค์์ ์คํ ์์ญ์ธ์ง ํ์ธํด์ค๋ค. ์ด ๋ ์กฐ๊ฑด์ ํด๋นํ์ง ์๋๋ค๋ฉด ์ง์ง fault error๋ค.
mmap๊ณผ munmap์ ๊ตฌํํ๋ค. file backed type์ด ์ฌ๊ธฐ์ ์ํ๋ค. ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๋ ์ด์ ๋ ๋ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ ์ํด์์ด๋ค. anon type๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก lazy load๋ก ๊ตฌํ์ ํด์ค๋ค. ์ฃผ์ด์ง length์ ๋ํด์ page์ ํ์ผ์ ์ฝ์ ๋ถ๋ถ์ ๋ํ ์ ๋ณด๋ฅผ aux๋ก ์ ์ ์ฅํด์ ์ ์ฅํด๋๋ค. ๊ผผ๊ผผํ๊ฒ ์ง์ผ์ง ๋์ค์ fork๊ฐ ์ผ์ด๋๊ฑฐ๋ ํ ๋ ๋ฌธ์ ๊ฐ ์๋ค...
munmap์ ํด์ค ๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์์ ์ด ์ผ์ด๋ฌ๋ค๋ฉด, disk์ ๋ค์ ์ ์ ์ฅํด ์ฃผ์ด์ผ ํ๋ค... (extra์ธ cow๋ฅผ ํ๋ฉด ๋ ํจ์จ์ ์ด๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ง๋ง... ์ด๋๊น์ง๋ extra์ด๋๊น...)
์ด๋ฐ์ ๋ง์น ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๊ณ๊ฐ ์๋ ๊ฒ์ฒ๋ผ illusion์ ๋ง๋ค ์ ์๋ค๊ณ ํ๋๋ฐ, ๋ฐ๋ก swap in/out ๋๋ถ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ์ฐจ์ ๋ ์ด์ ํ ๋น ๋ฐ์ ์ ์์ ๋, ๊ธฐ์กด์ ๋ฉ๋ชจ๋ฆฌ page์ค์์ ์ ์ฑ ์ ์ํด์ victim์ ์ ํด์ file backed ๋ผ๋ฉด ๋ค์ disk๋ก, anon์ด๋ผ๋ฉด swap disk๋ก ๋ณด๋ด๊ณ , ๊ทธ ์๋ฆฌ๋ฅผ ํ ๋นํด์ฃผ๋ ๊ฒ์ด๋ค.
์ ์ฑ ์ cache replacement policy ์ด๋ฐ์์ผ๋ก ๊ฒ์ํ๋ฉด ๋ง์ด ๋์จ๋ค. ๋๋ LRU์ nextfit์ ๊ตฌํํ๋ค. ์ด์ ํ์ํ frame list๋ list ๋ฐ์ดํฐ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ , swap dick๋ bitmap์ ์ฌ์ฉํ๋ค. (extra์ธ cow๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ณต์ ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ฐ์ง ์๋๋ก swap list๊ฐ ํ์ํ์ง๋ง, ์ง๊ธ์ bitmap๋ง์ผ๋ก ์ถฉ๋ถํ๋ค.)