์ด์ ์ฒด์ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ๋ ํํ ์ฌ์ฉ๋๋ ํ์ด์ง์ ์์๋ณธ๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ฆฌ๊ฐ ํ์ํ ์ด์ ์ ์ธ๊ทธ๋จผํ ์ด์ ์ ์๋ ๋ฐฉ์, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ, ํ์ด์ง์ด ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ค. ๋ํ, x86_64 ์ํคํ ์ฒ์์ ์ฌ์ฉํ๋ ํ์ด์ง ํ ์ด๋ธ์ ๋ค์ธต ๊ตฌ์กฐ๋ ์ดํด๋ณธ๋ค.
ํ๋ก๊ทธ๋จ ๊ฐ ๋ถ๋ฆฌ๋ ์ด์ ์ฒด์ ๋ฐ๋์ ํด์ผ ํ๋ ์ผ์ด๋ค. ์๋ฅผ ๋ค์ด, ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํ ์คํธ ์๋ํฐ๋ฅผ ๊ฐ์ญํ๋ ์ผ์ด ์์ด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ์ด์ ์ฒด์ ๋ ํ๋์จ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ๋ก์ธ์ค๊ฐ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํ๋ค. ํ๋์จ์ด๋ ์ด์ ์ฒด์ ๊ตฌํ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ค์ํ๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ ๋๋ ์์คํ ์ ์ฌ์ฉ๋๋ ARM Cortex-M ํ๋ก์ธ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ์ฅ์น (Memory Protection Unit, MPU)๊ฐ ์์ด์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ์ ๋ค๋ฅธ ์ ๊ทผ ๊ถํ(ex, ์ ๊ทผ ๋ถ๊ฐ, ์ฝ๊ธฐ ์ ์ฉ, ์ฝ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅ)์ ๊ฐ๋๋ก ์์ ์ซ์(ex, 8)๋ฅผ ์ง์ ํ ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋๋ง๋ค MPU๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ ์์ ์๋ ์ฃผ์๋ฅผ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๊ถํ์ผ๋ก ์ฌ์ฉํ๋์ง ํ์ธํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค. ํ๋ก์ธ์ค๋ฅผ ์ ํํ ๋๋ง๋ค ๊ตฌ์ญ๊ณผ ์ ๊ทผ ๊ถํ์ ๋ฐ๊ฟ์ ์ด์ ์ฒด์ ๊ฐ ๊ฐ ํ๋ก์ธ์ค๊ฐ ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋๋ก ํ๋ค. ์ด๋ฐ ์์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์๋ก ๋ถ๋ฆฌํ๋ค. console.log(ARM)
x86์ ์ธ๊ทธ๋จผํ ์ด์ ๊ณผ ํ์ด์ง, ์ด ๋ ๊ฐ์ง ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋ฐฉ์์ ์ง์ํ๋ค.
์ธ๊ทธ๋จผํ ์ด์ ์ ์ ๊ทผํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋๋ฆฌ๊ธฐ ์ํด 1978๋ ์ ๋์ ๋๋ค. ๊ทธ ๋น์์ CPU๋ 16๋นํธ ์ฃผ์๋ง ์ฌ์ฉํ ์ ์์ด์ ์ ๊ทผํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ด 64KB๋ก ์ ํ๋๋ค. 64KB๋ณด๋ค ๋ ๋ง์ด ์ ๊ทผํ๊ธฐ ์ํด ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ค์ด ์ถ๊ฐ๋๊ณ , ๊ฐ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ ์คํ์ ์ฃผ์๋ฅผ ๋ด๋๋ค. CPU๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋๋ง๋ค ์คํ์ ์ ๋ ํด์, 1MB ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊น์ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
CPU๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ผ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ๋ฅผ ์๋์ผ๋ก ์ ํํ๋ค. ๋ช
๋ น์ด๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ(CS
)๋ฅผ ์ฌ์ฉํ๊ณ , ์คํ ์ฐ์ฐ(push/pop) ์ ์คํ ์ธ๊ทธ๋จผํธ(SS
)๋ฅผ ์ฌ์ฉํ๋ค. ๋ค๋ฅธ ๋ช
๋ น์ด๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(DS
)๋ ์ฌ๋ถ ์ธ๊ทธ๋จผํธ(ES
)๋ฅผ ์ฌ์ฉํ๋ค. ๋์ค์ ์ถ๊ฐ๋ ์ฌ๋ถ ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ์ธ FS
์ GS
๋ ์์ ๋กญ๊ฒ ์ฌ์ฉ๋๋ค.
์ธ๊ทธ๋จผํ ์ด์ ์ ์ด์ฐฝ๊ธฐ ๋ฒ์ ์์ ์คํ์ ์ด ์ธ๊ทธ๋จผํธ ๋ ์ง์คํฐ์ ๊ทธ๋๋ก ๋ด๊ฒจ์์๊ณ ์ ๊ทผ ์ ์ด๋ ์คํ๋์ง ์์๋ค. ์ด์ฐฝ๊ธฐ ๋ฒ์ ์ ๋ณดํธ ๋ชจ๋๊ฐ ๋์ ๋๋ฉด์ ๋ณ๊ฒฝ๋๋ค. CPU๊ฐ ๋ณดํธ ๋ชจ๋์์ ์๋ํ ๋, ์ธ๊ทธ๋จผํธ ๋์คํฌ๋ฆฝํฐ๋ ๋ก์ปฌ๊ณผ ๊ธ๋ก๋ฒ ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ๋ด๋๋ค. ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์ ์คํ์ ์ฃผ์๋ฅผ ํฌํจํ์ฌ ์ธ๊ทธ๋จผํธ ์ฌ์ด์ฆ์ ์ ๊ทผ ๊ถํ์ ๋ด๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ง๋ค ํ๋ก์ธ์ค ๊ณ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์๋ง ์ ๊ทผํ๋๋ก ํ๋ ๋ณ๊ฐ์ ๊ธ๋ก๋ฒ/๋ก์ปฌ ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์ ๋ถ๋ฌ์์ ์ด์ ์ฒด์ ๊ฐ ํ๋ก์ธ์ค ๊ฐ ๋ถ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ์ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ธ๊ทธ๋จผํ ์ด์ ์ ํ์ฌ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉ ์ค์ธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ์ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ค.
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ๋
์ ๋ฌผ๋ฆฌ์ ์ ์ฅ ์ฅ์น์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ถ์ํํ๋ ๊ฒ์ด๋ค. ์ ์ฅ ์ฅ์น์ ์ง์ ์ ๊ทผํ์ง ์๊ณ ๋ณํ ๋จ๊ณ๋ฅผ ๋จผ์ ๊ฑฐ์น๋ค. ์ธ๊ทธ๋จผํ
์ด์
์์๋ ํ์ฌ ์ฌ์ฉ ์ค์ธ ์ธ๊ทธ๋จผํธ์ ์คํ์
์ฃผ์๋ฅผ ๋ํ๋ ๋ณํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณค๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก๊ทธ๋จ์ด ์คํ์
์ด 0x1111000
์ธ ์ธ๊ทธ๋จผํธ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 0x1234000
๋ฅผ ์ ๊ทผํ๋ฉด ์ค์ ๋ก๋ ๋์ ๋ํ 0x2345000
์ ์ ๊ทผํ๋ค.
๋ณํํ๊ธฐ ์ ์ ์ฃผ์๋ฅผ ๊ฐ์ ์ฃผ์, ๋ณํ ํ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๊ตฌ๋ถํ ์ ์๋ค. ๋ฌผ๋ฆฌ ์ฃผ์๊ฐ ์ ์ผ๋ฌด์ดํ๊ณ ํญ์ ๋๊ฐ์ด ๊ตฌ๋ณ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด ๋ ์ฃผ์์ ํฐ ์ฐจ์ด์ ์ด๋ค. ๋ฐ๋ฉด, ๊ฐ์ ์ฃผ์๋ ๋ณํ ํจ์์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค. ๊ฐ์ ์ฃผ์๊ฐ ๊ฐ์๋ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค. ๋ํ, ๋ณํ ํจ์๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ ๋ฌผ๋ฆฌ ์ฃผ์์ธ๋ฐ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค.
๊ฐ์ ํ๋ก๊ทธ๋จ ๋ ๊ฐ๋ฅผ ๋์์ ๋๋ฆด ๋ ์ด๋ฐ ํน์ฑ์ด ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
์ ๊ทธ๋ฆผ์์ ๊ฐ์ ํ๋ก๊ทธ๋จ ๋ ๊ฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ณํ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค์ด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์คํด์ค๋ ์ธ๊ทธ๋จผํธ ์คํ์ ์ด 100์ด๋ฏ๋ก 0-150 ์ฌ์ด ๊ฐ์ ์ฃผ์๋ 100-250 ์ฌ์ด ์ค์ ์ฃผ์๋ก ๋ณํ๋๋ค. ๋ ๋ฒ์งธ ์ธ์คํด์ค๋ ์คํ์ ์ด 300์ด๋ฏ๋ก 0-150 ์ฌ์ด ๊ฐ์ ์ฃผ์๋ 300-450 ์ฌ์ด ์ค์ ์ฃผ์๋ก ๋ณํ๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฒ์ ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ฝ๋์ ๊ฐ์ ๊ฐ์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๋ก ๊ฐ์ญ์ด ์๋๋ก ํ๋ค.
๋ ํ๋ก๊ทธ๋จ์ด ์์ ํ ๋ค๋ฅธ ๊ฐ์ ์ฃผ์๋ฅผ ์ฌ์ฉํด๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ฌด ์์น์๋ ํ๋ก๊ทธ๋จ์ ๋์ ์๋ ์๋ค. ์ด ๋๋ถ์, ์ด์ ์ฒด์ ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ์ปดํ์ผํ์ง ์์๋ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ์ ์ฃผ์์ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ๋ค๋ฅด๊ฒ ๋๋ ๊ฒ์ด ์ธ๊ทธ๋จผํ ์ด์ ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ง๋ง, ํํธํ ๋ฌธ์ ๋ ๋ค๋ฐ๋ฅธ๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์์ด๋ ํ๋ก๊ทธ๋จ์ ์ธ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฒน์น์ง ์๊ฒ ๋์ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐ์๋์ด ์์ด์ผ ํ๋ ๊ฒ๊ณผ ๋น์ด์๋ ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฌธ์ ๋ค.
ํํธํ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์คํ์ ๋ฉ์ถ๊ณ , ์ฌ์ฉ ์ค์ธ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ฆฌ ๋ถ์ฌ๋๊ณ , ์คํ์ ์ ๋ณ๊ฒฝํ๊ณ ๋ค์ ์คํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ด์ ์ฐ์๋ ๊ณต๊ฐ์ด ์ถฉ๋ถํ ์์ด์ ์ธ ๋ฒ์งธ ์ธ์คํด์ค๋ฅผ ์คํํ ์ ์๋ค.
์ด๋ฐ ์์ ์กฐ๊ฐ ๋ชจ์์ ๋์ฉ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌํ๋ฏ๋ก ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค. ๋ํ, ํํธํ๊ฐ ์ฌํด์ง๊ธฐ ์ ์ ์ ๊ธฐ์ ์ผ๋ก ์ํ๋ผ์ผ ํ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ด ๋ฌด์์๋ก ๋ฉ์ถฐ์ ์ฑ๋ฅ ์์ธก์ด ํ๋ค์ด์ง๊ณ ์ด์ ์ฒด์ ์ ๋ฐ์์ด ๋ฉ์ถ ์๋ ์๋ค.
ํํธํ ๋ฌธ์ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์์คํ ์์ ์ธ๊ทธ๋จผํ ์ด์ ์ ์ฌ์ฉํ์ง ์๋๋ค. ์ ํํ๋, x86์ 64๋นํธ ๋ชจ๋๊ฐ ์ธ๊ทธ๋จผํ ์ด์ ์ ์ง์ํ์ง ์๋๋ค. ๋์ ์ ํํธํ ๋ฌธ์ ๋ฅผ ์์ ํ ํผํ ์ ์๋ ํ์ด์ง ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
ํ์ด์ง์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณ ์ ํฌ๊ธฐ์ ์์ ๋ธ๋ก์ผ๋ก ๋๋๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ธ๋ก์ ํ์ด์ง๋ผ๊ณ ํ๊ณ ๋ฌผ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๋ธ๋ก์ ํ๋ ์์ด๋ผ๊ณ ํ๋ค. ๊ฐ ํ์ด์ง๋ฅผ ํ๋ ์์ ํ๋์ฉ ๋งคํํ ์ ์์ด์ ๋๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐ์๋์ด ์์ง ์์ ๋ฌผ๋ฆฌ ํ๋ ์์ ๋๋ ์ ๋์ ์ ์๋ค.
ํ์ด์ง์ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํํธํ๋์ง ์๋๋ค.
์ ๊ทธ๋ฆผ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ์ด ํ์ด์ง ์ฌ์ด์ฆ๊ฐ 50 ๋ฐ์ดํธ์ธ ํ์ด์ง 3๊ฐ๋ก ๋๋ ์ก๋ค. ๊ฐ ํ์ด์ง๋ ๊ฐ๋ณ์ ์ผ๋ก ํ๋ ์์ ๋งคํ๋๋ค. ๋๋ถ์ ์ฐ์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐ์๋์ง ์์ ๋ฌผ๋ฆฌ ํ๋ ์์ ๋งคํํ ์ ์๊ฒ ๋๋ค. ํ์ด์ง์ ์ฌ์ฉํ๋ฉด ์กฐ๊ฐ ๋ชจ์์ ํ์ง ์์๋ ํ๋ก๊ทธ๋จ ์ธ์คํด์ค ์ธ ๊ฐ๋ฅผ ์คํํ ์ ์๋ค.
์ธ๊ทธ๋จผํ ์ด์ ์ ์์์ ํฌ๊ธฐ๊ฐ ํฌ๊ณ ๊ฐ๋ณ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง๋ง, ํ์ด์ง์ ๋ค์์ ํฌ๊ธฐ๊ฐ ์๊ณ ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค. ๋ชจ๋ ํ๋ ์์ ํฌ๊ธฐ๊ฐ ๊ฐ์์, ํฌ๊ธฐ๊ฐ ์๋ค๊ณ ํ๋ ์์ ์ฌ์ฉ ๋ชป ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ทธ๋์ ํํธํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํน์, ํํธํ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ผ ์๋ ์๋ค. ์ฌ์ ํ ์จ์ ํํธํ๊ฐ ์กด์ฌํ๊ณ , ์ด๋ฅผ ๋ด๋ถ ํํธํ๋ผ๊ณ ํ๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋ชจ๋ ํ์ด์ง ํฌ๊ธฐ์ ๋ฑ ๋ง๊ฒ ๋๋ ์ง์ง ์์์ ๋ด๋ถ ํํธํ๊ฐ ๋ฐ์ํ๋ค. ํ์ด์ง ํฌ๊ธฐ๊ฐ 50 ๋ฐ์ดํธ์ด๋ฉด ํฌ๊ธฐ๊ฐ 101 ๋ฐ์ดํธ์ธ ํ๋ก๊ทธ๋จ์ ํ์ด์ง 3๊ฐ๋ฅผ ์ฌ์ฉํ๊ณ 49 ๋ฐ์ดํธ๋ฅผ ๋ญ๋นํ๋ค. ํํธ, ์ธ๊ทธ๋จผํ ์ด์ ์ฌ์ฉ ์ ๋ฐ์ํ๋ ํํธํ๋ ์ธ๋ถ ํํธํ๋ผ๊ณ ํ๋ค.
๋ด๋ถ ํํธํ๋ ๋์์ง๋ง, ์ธ๊ทธ๋จผํ ์ด์ ์ผ๋ก ๋ฐ์ํ๋ ์ธ๋ถ ํํธํ๋ณด๋จ ๋ซ๋ค. ๋ด๋ถ ํํธํ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๊ธด ํด๋ ์กฐ๊ฐ ๋ชจ์์ด ํ์ ์๊ณ ํํธํ ๋ฐ์๋(๋ฉ๋ชจ๋ฆฌ ์์ญ ๋น ํ๊ท ํ์ด์ง ์ ๋ฐ ์ ๋)์ ์์ธกํ ์ ์๋ค.
ํ์ด์ง๊ฐ ๋ฐฑ๋ง ๊ฐ ์๋ค๋ฉด ๋ฐฑ๋ง ๊ฐ ๊ฐ๊ฐ ํ๋ ์์ ๋งคํ๋ผ์ผ ํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ๋งคํ ์ ๋ณด๋ ์ด๋๊ฐ์ ๋ณด๊ดํด์ผ ํ๋ค. ์ธ๊ทธ๋จผํ ์ด์ ์ ํ์ฑ ๋ฉ๋ชจ๋ฆฌ ์์ญ๋ง๋ค ๋ณ๋์ ์ธ๊ทธ๋จผํธ ์ ํ์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ด์ง์ ์ฌ์ฉํ ๋๋ ํ์ด์ง๊ฐ ๋ ์ง์คํฐ๋ณด๋ค ํจ์ฌ ๋ง์ผ๋ฏ๋ก ๋ณ๋์ ๋ ์ง์คํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋์ ์ ํ ์ด๋ธ ๊ตฌ์กฐ์ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํด์ ๋งคํ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ค.
์์ ์์์ ํ์ด์ง ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ๋ค.
ํ๋ก๊ทธ๋จ์ ๊ฐ์์ ํ์ด์ง ํ
์ด๋ธ์ ๊ฐ๋๋ค. x86
CPU๋ ํ์ฌ ์ฌ์ฉ ์ค์ธ ํ
์ด๋ธ์ CR3
๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. ์ด์ ์ฒด์ ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ ์ ์๋ง์ ํ์ด์ง ํ
์ด๋ธ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ CR3
๋ ์ง์คํฐ์ ์ ์ฅํด์ผ ํ๋ค.
๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋๋ง๋ค, CPU๋ ์ด ๋ ์ง์คํฐ์์ ํ ์ด๋ธ ํฌ์ธํฐ๋ฅผ ์ฝ์ด์์ ์ ๊ทผํ๋ ค๋ ํ์ด์ง์ ๋งคํ๋ ํ๋ ์์ ํ ์ด๋ธ์์ ์ฐพ๋๋ค. ์ด ๊ณผ์ ์ ํ๋์จ์ด์ ์ผ๋ก ์คํ๋๊ณ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์์ ํ ํฌ๋ช ํ๋ค. ๋ง์ CPU ์ํคํ ์ฒ๋ ๋ณํ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด, ๋ง์ง๋ง ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ตํ๋ ํน์ํ ์บ์๋ฅผ ๊ฐ๊ณ ์๋ค.
์ํคํ ์ฒ๋ง๋ค ๋ค๋ฅด์ง๋ง, ํ์ด์ง ํ ์ด๋ธ์ ํ๋๊ทธ ํ๋๋ฅผ ๋ฌ์ ์ ๊ทผ ๊ถํ ๊ฐ์ ์์ฑ์ ์ ์ฅํ๊ธฐ๋ ํ๋ค. ์์ ๊ทธ๋ฆผ์์ "r/w" ํ๋๊ทธ๋ ํ์ด์ง๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ๋ง๋ ๋ค.
1๋จ์ง๋ฆฌ ํ์ด์ง ํ
์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ปค์ง๋ฉด ํ
์ด๋ธ๋ ์ปค์ ธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ํ์ด์ง 0
, 1,000,000
, 1,000,050
, 1,000,100
๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ์ณ๋ณด์.
ํ๋ก๊ทธ๋จ์ ๋ฌผ๋ฆฌ ํ์ด์ง๋ฅผ 4๊ฐ๋ง ์ฌ์ฉํ์ง๋ง, ํ์ด์ง ํ ์ด๋ธ์ ๋ฐฑ๋ง ๊ฐ๊ฐ ๋๋ ํญ๋ชฉ์ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋น ํญ๋ชฉ์ ํ ์ด๋ธ์์ ๋บ ์ ์๋ค. ๊ทธ๋ด ๊ฒฝ์ฐ CPU๊ฐ ํ์ด์ง๋ฅผ ๋ณํํ ๋ ์๋ง์ ํญ๋ชฉ์ผ๋ก ๋ฐ๋ก ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (๋ค ๋ฒ์งธ ํ์ด์ง๊ฐ ๋ค ๋ฒ์งธ ํญ๋ชฉ์ ์ฌ์ฉํ๋์ง ๋ณด์ฅ ๋ชป ํจ)
2๋จ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์๋ค. 2๋จ ํ ์ด๋ธ์ ์ฃผ์ ๊ตฌ์ญ์ด ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ ๋ฒจ 2๋ผ๋ ํ ์ด๋ธ์ ์ถ๊ฐํด์ ์ฃผ์ ๊ตฌ์ญ๊ณผ ๋ ๋ฒจ 1 ํ์ด์ง ํ ์ด๋ธ ๊ฐ์ ๋งคํ์ ๋ณด๊ดํ๋ค.
์๋ฅผ ๋ค์ด, ๋ ๋ฒจ 1 ํ์ด์ง ํ
์ด๋ธ์ ํฌ๊ธฐ๊ฐ 10,000
์ธ ๊ตฌ์ญ๋ง ๋ด๋นํ๊ฒ ํ๋ค.
ํ์ด์ง 0์ ์ฒซ ๋ฒ์งธ 10,000
๋ฐ์ดํธ ๊ตฌ์ญ์ ํด๋นํ๋ฏ๋ก ๋ ๋ฒจ 2 ํ์ด์ง ํ
์ด๋ธ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ์ฌ์ฉํ๋ค. ์ด ํญ๋ชฉ์ ๋ ๋น 1 ํ์ด์ง ํ
์ด๋ธ์ธ T1์ ๊ฐ๋ฆฌํจ๋ค. T1์ ํ์ด์ง 0์ด ํ๋ ์ 0์ ๊ฐ๋ฆฌํค๊ณ ์์์ ์๋ ค์ค๋ค.
ํ์ด์ง 1,000,000
, 1,000,050
, 1,000,100
๋ 100๋ฒ์งธ 10,000
๋ฐ์ดํธ ๊ตฌ์ญ์ ํด๋นํ๋ฏ๋ก ๋ ๋ฒจ 2 ํ์ด์ง์ 100๋ฒ์งธ ํญ๋ชฉ์ ์ฌ์ฉํ๋ค. ์ด ํญ๋ชฉ์ ๋ค๋ฅธ ๋ ๋น 1 ํ์ด์ง ํ
์ด๋ธ์ธ T2๋ฅผ ๊ฐ๋ฆฌํจ๋ค. T2๋ ์ธ ํ์ด์ง๋ฅผ 100
, 150
, 200
ํ๋ ์์ ๋งคํํ๋ค. ๋ ๋ฒจ 1 ํ์ด์ง์ ์๋ ํ์ด์ง ์ฃผ์๋ ๊ตฌ์ญ ์คํ์
์ ํฌํจํ์ง ์๋๋ค. ์ฆ, 1,000,050
ํ์ด์ง๋ ๊ทธ๋ฅ 50
์ด๋ค.
์ฌ์ ํ ๋ ๋ฒจ 2 ํ์ด์ง์ ํญ๋ชฉ ๋ฐฑ๊ฐ๊ฐ ๋น์ด์์ง๋ง, ์ ์ ๋ฐฑ๋ง ๊ฐ ํญ๋ชฉ์ด ๋น์์ ๋๋ณด๋ค ๋ซ๋ค. 10,000
๊ณผ 1,000,000
์ฌ์ด ๋งคํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ์ ์ฑ์ ๋ฃ์ ๋ ๋ฒจ 1 ํ์ด์ง๋ฅผ ๋ง๋ค์ง ์์๋ ๋ผ์ ๊ณต๊ฐ์ ๋ง์ด ์ ์ฝํ๋ค.
2๋จ ํ์ด์ง ํ ์ด๋ธ์ 3๋จ, 4๋จ ๋๋ ๊ทธ ์ด์์ ๋จ์ผ๋ก ๋๋ฆด ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ํ์ด์ง ํ ์ด๋ธ ๋ ์ง์คํฐ๋ ์ต์์ ๋ ๋ฒจ ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๋ฉฐ, ์ด ํ ์ด๋ธ์ ๋ค์ ํ์ ๋ ๋ฒจ ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๊ณ , ๋ค์ ๊ทธ ํ ์ด๋ธ์ ๋ค์ ํ์ ๋ ๋ฒจ ํ ์ด๋ธ์ ๊ฐ๋ฆฌํค๊ณ ์ด๋ฐ ์์ผ๋ก ๊ณ์๋๋ค. ๋ง์ง๋ง ๋ ๋ฒจ 1 ํ์ด์ง ํ ์ด๋ธ์ ๋งคํ๋ ํ๋ ์์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ฐ ๋ฐฉ์์ ๋ค์ธต ๋๋ ๊ณ์ธต์ ํ์ด์ง ํ ์ด๋ธ์ด๋ผ๊ณ ํ๋ค.
ํ์ด์ง๊ณผ ๋ค์ธต ํ์ด์ง ํ ์ด๋ธ์ ์๋๋ฐฉ์์ ์์์ผ๋ฏ๋ก, x86_64 ์ํคํ ์ฒ์์ ํ์ด์ง์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง ์์๋ณธ๋ค. (CPU๊ฐ 64 ๋นํธ ๋ชจ๋๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํจ)
x86_64 ์ํคํ ์ฒ๋ 4๋จ ํ์ด์ง ํ ์ด๋ธ๊ณผ 4KB ํฌ๊ธฐ์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ ํ์ด์ง ํ ์ด๋ธ์ ๋ ๋ฒจ์ ์๊ด์์ด 512๊ฐ์ ํญ๋ชฉ์ ๊ฐ๋๋ค. ๊ฐ ํญ๋ชฉ์ ํฌ๊ธฐ๊ฐ 8 ๋ฐ์ดํธ์ด๋ฏ๋ก ๊ฐ ํ ์ด๋ธ์ 512 * 8 Bytes = 4KB ํฌ๊ธฐ๋ฅผ ๊ฐ๋๋ค. ํ์ด์ง ํ ๊ฐ๋ 4KB์ด๋ฏ๋ก ํ ์ด๋ธ์ด ํ์ด์ง ํ๋์ ๋ฑ ๋ค์ด๋ง๋๋ค.
๊ฐ์ ์ฃผ์์์ ๋ ๋ฒจ์ ๋ง๋ ํ์ด์ง ํ ์ด๋ธ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ก ์์๋ผ ์ ์๋ค.
๊ฐ ํ ์ด๋ธ ์ธ๋ฑ์ค๋ 9 ๋นํธ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด์ ๋ง๊ฒ ๊ฐ ํ ์ด๋ธ์ 2^9 = 512๊ฐ์ ํญ๋ชฉ์ ๊ฐ๋๋ค. ์ตํ์ 12 ๋นํธ๋ 4KB ํฌ๊ธฐ(2^12 bytes= 4KB)์ ํ์ด์ง ๋ด๋ถ์ ์คํ์ ์ ๋ํ๋ธ๋ค. 48๋ถํฐ 64๋นํธ๋ ๋ฒ๋ ค์ง๋ค. ์ฆ, x86_64๋ 48 ๋นํธ ์ฃผ์๋ง ์ง์ํ๋ฏ๋ก ์ค์ ๋ก 64 ๋นํธ๊ฐ ์๋๋ค.
48์์ 64 ๋นํธ๊ฐ ๋ฒ๋ ค์ ธ๋, ์ฌ๊ธฐ์ ์์๋ก ๊ฐ์ ์ค์ ํ ์ ์๋ค. ๋์ ์ ์ฃผ์๋ฅผ ๊ณ ์ ํ๊ฒ ์ ์งํ๊ณ ํฅํ์ ํ์ด์ง ํ ์ด๋ธ์ 5๋จ์ผ๋ก ํ์ฅํ๊ธฐ ์ํด ์ด ๋ฒ์์ ๋ชจ๋ ๋นํธ๊ฐ 47 ๋นํธ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค. ์ด๋ 2์ ๋ณด์ ํ์ฅ๊ณผ ๋งค์ฐ ๋น์ทํด์ ๋ถํธ ํ์ฅ์ด๋ผ๊ณ ํ๋ค. ์ฃผ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถํธ ํ์ฅ๋์ง ์์ผ๋ฉด CPU๊ฐ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
์ธํ ์ ์ต์ ์์ด์ค ๋ ์ดํฌ CPU๋ ๊ฐ์ ์ฃผ์๋ฅผ 48๋นํธ์์ 57๋นํธ๋ก ํ์ฅํ๋ 5๋จ ํ์ด์ง ํ ์ด๋ธ์ ์ ํ์ ์ผ๋ก ์ง์ํ๋ค(์ ๊ทผ ๊ฐ๋ฅ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ 256 TB์์ 128 PB๋ก ๋์ด๋๋ค). ์์ง ํน์ CPU์ ๋ง๊ฒ ์ปค๋์ ์ต์ ํํ ํ์๋ ์์ผ๋ฏ๋ก 4๋จ ํ์ด์ง ํ ์ด๋ธ๋ง ๋ค๋ฃจ๋๋ก ํ๋ค.
์์ ๋ฅผ ํตํด ๋ณํ ๊ณผ์ ์ ์๋ ๋ฐฉ์์ ์์ธํ ์์๋ณธ๋ค.
ํ์ฌ ํ์ฑํ๋ ๋ ๋ฒจ 4 ํ์ด์ง ํ
์ด๋ธ(4๋จ ํ์ด์ง ํ
์ด๋ธ ๋ฃจํธ)์ ๋ฌผ๋ฆฌ ์ฃผ์๋ CR3
๋ ์ง์คํฐ์ ์ ์ฅ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ ํ์ด์ง ํ
์ด๋ธ ํญ๋ชฉ์ ๋ค์ ๋ ๋ฒจ ํ
์ด๋ธ์ ๋ฌผ๋ฆฌ ํ๋ ์์ ๊ฐ๋ฆฌํจ๋ค. ๋ ๋ฒจ 1 ํ
์ด๋ธ์ ํญ๋ชฉ์ ๋งคํ๋ ํ๋ ์์ ๊ฐ๋ฆฌํจ๋ค. ํ์ด์ง ํ
์ด๋ธ์ ๋ชจ๋ ์ฃผ์๋ ๊ฐ์์ด ์๋ ์ค์ ์ฃผ์๋ค. ๊ฐ์ ์ฃผ์๋ฅผ ์ผ๋ค๋ฉด CPU๊ฐ ํด๋น ์ฃผ์๋ ๋ณํํด์ผ ํ๋ฏ๋ก ๋ฌดํ ์ฌ๊ท๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
์์ ํ์ด์ง ํ
์ด๋ธ ๊ณ์ธต์ ํ๋๊ฒ ํ์๋ ํ์ด์ง ๋ ๊ฐ๋ฅผ ๋งคํํ๋ค. ํ์ด์ง ํ
์ด๋ธ ์ธ๋ฑ์ค์์ ๋ ํ์ด์ง์ ๊ฐ์ ์ฃผ์๊ฐ 0x803FE7F000
์ 0x803FE00000
์์ ์ ์ ์๋ค. ํ๋ก๊ทธ๋จ์ด 0x803FE7F5CE
๋ฒ ์ฃผ์๋ฅผ ์ฝ์ผ๋ ค๊ณ ํ ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๋ณด์. ์ฐ์ , ์ฃผ์๋ฅผ ์ด์ง์๋ก ๋ฐ๊ฟ์ ์ฃผ์์ ํ์ด์ง ํ
์ด๋ธ ์ธ๋ฑ์ค์ ํ์ด์ง ์คํ์
์ ์ ํ๋ค.
์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ก ํ์ด์ง ํ ์ด๋ธ ๊ณ์ธต์ ๋ฐ๋ผ ์ฃผ์์ ๋งคํ๋ ํ๋ ์์ ์์๋ผ ์ ์๋ค.
CR3
๋ ์ง์คํฐ์์ ๋ ๋ฒจ 4 ํ ์ด๋ธ์ ์ฃผ์๋ฅผ ์ฝ๋๋ค.- ๋ ๋ฒจ 4 ์ธ๋ฑ์ค๊ฐ 1์ด๋ฏ๋ก, ๋ ๋ฒจ 4 ํ ์ด๋ธ์์ 1๋ฒ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ํญ๋ชฉ์ ์ฐพ๋๋ค. ์ด ํญ๋ชฉ์์ ๋ ๋ฒจ 3 ํ ์ด๋ธ์ด 16KB ์ฃผ์์ ์ ์ฅ๋์ด ์์์ ์ ์ ์๋ค.
- 16KB ์ฃผ์์์ ๋ ๋ฒจ 3 ํ ์ด๋ธ์ ๋ถ๋ฌ์์ 0๋ฒ ์ธ๋ฑ์ค ํญ๋ชฉ์ ์ฐพ๋๋ค. ์ด ํญ๋ชฉ์์ ๋ ๋ฒจ 2 ํ ์ด๋ธ์ด 24KB์ ์์์ ์ ์ ์๋ค.
- ๋ ๋ฒจ 2 ์ธ๋ฑ์ค๊ฐ 511์ด๋ฏ๋ก, ํ์ด์ง์ ๋ง์ง๋ง ํญ๋ชฉ์ ์ฐพ์์ ๋ ๋ฒจ 1 ํ ์ด๋ธ์ ์ฃผ์๋ฅผ ์์๋ธ๋ค.
- ๋ ๋ฒจ 1 ํ ์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ 127์ธ ํญ๋ชฉ์ ๋ณด๊ณ ํด๋น ํ์ด์ง๊ฐ 12KB(16์ง์๋ก 0x3000) ํ๋ ์์ ๋งคํ๋์ด ์์์ ์ ์ ์๋ค.
- ๋ง์ง๋ง์ผ๋ก, ํ๋ ์ ์ฃผ์์ ํ์ด์ง ์คํ์ ์ ๋ํด์ ๋ฌผ๋ฆฌ ์ฃผ์ 0x3000 + 0x5ce = 0x35ce๋ฅผ ์์๋ธ๋ค.
๋ ๋ฒจ 1 ํ
์ด๋ธ ๋ด๋ถ์ ํ์ด์ง๋ ์ฝ๊ธฐ ์ ์ฉ์ ๋ปํ๋ r
๊ถํ์ ๊ฐ๋๋ค. ๊ถํ์ ํ๋์จ์ด๊ฐ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ํด๋น ํ์ด์ง์ ์ฐ๊ธฐ๋ฅผ ์๋ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค. ์์ ๋ ๋ฒจ ํ์ด์ง์ ๊ถํ์ด ํ์ ๋ ๋ฒจ ํ
์ด๋ธ์ ๊ฐ๋ฅํ ๊ถํ์ ์ ํํ๋ฏ๋ก ๋ ๋ฒจ 3 ํญ๋ชฉ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ฉด ํ์ ๋ ๋ฒจ์ด ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ถํ์ ์ง์ ํด๋ ํด๋น ํญ๋ชฉ์ ์ธ ์ ์๋ค.
์ด ์์์์๋ ๊ฐ ํ ์ด๋ธ์ ๋จ์ผ ์ธ์คํด์ค๋ง ์ฌ์ฉํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ ๋ ๋ฒจ๋ง๋ค ์ฌ๋ฌ ๊ฐ์ ์ธ์คํด์ค๊ฐ ์๋ค. ์ต๋๋ก ๋ค์์ ๊ฐ์์ ํ ์ด๋ธ์ด ์๋ค.
- ๋ ๋ฒจ 4 ํ ์ด๋ธ 1๊ฐ
- ๋ ๋ฒจ 3 ํ ์ด๋ธ 512๊ฐ (๋ ๋ฒจ 4 ํ ์ด๋ธ์ ํญ๋ชฉ์ด 512๊ฐ ์์ผ๋ฏ๋ก)
- ๋ ๋ฒจ 2 ํ ์ด๋ธ 512 * 512๊ฐ(512๊ฐ์ ๋ ๋ฒจ 3 ํ ์ด๋ธ์ด ๊ฐ ํญ๋ชฉ์ 512๊ฐ ๊ฐ์ง๋ฏ๋ก)
- ๋ ๋ฒจ 1 ํ ์ด๋ธ 512 * 512 * 512๊ฐ
x86_64 ์ํคํ ์ฒ์ ํ์ด์ง ํ ์ด๋ธ์ 512๊ฐ ํญ๋ชฉ์ ๊ฐ์ง ๋ฐฐ์ด์ด๋ค. ๋ฌ์คํธ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
#[repr(align(4096))]
pub struct PageTable {
entries: [PageTableEntry; 512],
}
repr
์์ฑ์ผ๋ก ํ์ด์ง ํ
์ด๋ธ์ 4KB ๊ฒฝ๊ณ๋ก ํ์ด์ง ์ ๋ ฌํ๋ค. ์ด ์์ฑ์ผ๋ก ํ์ด์ง ํ
์ด๋ธ์ด ํญ์ ํ์ด์ง ์ ์ฒด๋ฅผ ์ฑ์์ ํญ๋ชฉ๋ค์ด ๋ฐ์งํ๊ฒ ๋ถ์ด์๋๋ก ์ต์ ํํ๋ค.
๊ฐ ํญ๋ชฉ์ 8 ๋ฐ์ดํธ(64 ๋นํธ) ํฌ๊ธฐ๋ฅผ ๊ฐ๊ณ ๋ค์์ ํ์์ ๋ฐ๋ฅธ๋ค.
๋นํธ | ์ด๋ฆ | ์๋ฏธ |
---|---|---|
0 | ์กด์ฌํจ | ํ์ด์ง๊ฐ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ์ ์์ |
1 | ์ฐ๊ธฐ ๊ฐ๋ฅ | ์ด ํ์ด์ง์ ์ฐ๊ธฐ ๊ฐ๋ฅ |
2 | ์ฌ์ฉ์ ์ ๊ทผ ๊ฐ๋ฅ | ์ค์ ์ ๋์ด์์ผ๋ฉด, ์ปค๋ ๋ชจ๋์์๋ง ์ด ํ์ด์ง์ ์ ๊ทผ ๊ฐ๋ฅ |
3 | ์บ์๋ฅผ ํตํ ์ฐ๊ธฐ | ์ฐ๋ฉด ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋จ |
4 | ์บ์ ํด์ | ์ด ํ์ด์ง์ ์บ์ ์ฌ์ฉ ์ ํจ |
5 | ์ ๊ทผ๋จ | ์ด ํ์ด์ง์ ์ฝ๊ธฐ ๋ฐ์ ์ CPU๊ฐ ์ด ๋นํธ๋ฅผ ์ค์ ํจ |
6 | ๋ํฐ | ์ด ํ์ด์ง์ ์ฐ๊ธฐ ๋ฐ์ ์ CPU๊ฐ ์ด ๋นํธ๋ฅผ ์ค์ ํจ |
7 | ํฐ ํ์ด์ง/null | P1๊ณผ P4์์๋ 0์ด๊ณ , P3์์๋ 1GB ํ์ด์ง๋ฅผ ์์ฑํ๊ณ , P2์์๋ 2MB ํ์ด์ง๋ฅผ ์์ฑํจ |
8 | ์ ์ญ | ์ฃผ์ ๊ณต๊ฐ ์ค์์น์์ ํ์ด์ง๊ฐ ์บ์์์ ์ง์์ง์ง ์์ (CR4 ๋ ์ง์คํฐ์ PGE ๋นํธ๊ฐ ์ค์ ๋ผ์ผ ํจ) |
9-11 | ์ฌ์ฉ ๊ฐ๋ฅ | ์ด์ ์ฒด์ ๊ฐ ์์ ๋กญ๊ฒ ์ฌ์ฉํด๋ ๋จ |
12-51 | ๋ฌผ๋ฆฌ ์ฃผ์ | ํ๋ ์์ด๋ ๋ค์ ํ์ด์ง ํ ์ด๋ธ์ 52๋นํธ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ์ ๋ ฌํ ํ์ด์ง |
52-62 | ์ฌ์ฉ ๊ฐ๋ฅ | ์ด์ ์ฒด์ ๊ฐ ์์ ๋กญ๊ฒ ์ฌ์ฉํด๋ ๋จ |
63 | ์คํ ๊ธ์ง | ์ด ํ์ด์ง์ ์ฝ๋ ์คํ์ ๊ธ์งํจ (EFER ๋ ์ง์คํฐ์ NXE ๋นํธ๊ฐ ์ค์ ๋ผ์ผ ํจ) |
12-51 ๋นํธ๋ง ๋ฌผ๋ฆฌ ํ๋ ์ ์ฃผ์ ์ ์ฅ์ ์ฌ์ฉ๋๋ค. ๋๋จธ์ง ๋นํธ๋ ํ๋๊ทธ๋ก ์ฌ์ฉ๋๊ฑฐ๋ ์ด์ ์ฒด์ ์์ ์์ ๋กญ๊ฒ ์ฌ์ฉ๋๋ค. ์ด๋ ํญ์ โ 4096 ๋ฐ์ดํธ๋ก ์ ๋ ฌํ ์ฃผ์๋ โก ํ์ด์ง ์ ๋ ฌ๋ ํ์ด์ง ํ ์ด๋ธ์ด๋ โข ๋งคํ๋ ํ๋ ์์ ์์์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค. ์ฆ, 0-11 ๋นํธ๋ ํญ์ 0์ด๋ฏ๋ก, ํ๋์จ์ด๊ฐ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋นํธ๋ฅผ 0์ผ๋ก ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ 0-11 ๋นํธ๋ฅผ ์ ์ฅํ ํ์ ์๋ค. x86_64 ์ํคํ ์ฒ๋ 52 ๋นํธ ๋ฌผ๋ฆฌ ์ฃผ์๋ง ์ง์ํ๋ฏ๋ก (48 ๋นํธ ๊ฐ์ ์ฃผ์๋ง ์ง์ํ๋ฏ์ด) 52โ63 ๋นํธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฅํ ํ์ ์๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ํ๋๊ทธ๋ค ์์ธํ ์ดํด๋ณธ๋ค.
์กด์ฌํจ
ํ๋๊ทธ๋ ํ์ด์ง์ ๋งคํ ์ฌ๋ถ๋ฅผ ๊ตฌ๋ณํ๋ค. ์ฃผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐผ์ ๋ ํ์ด์ง๋ฅผ ์์๋ก ๋์คํฌ์ ์ค์ ์์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค. ์ดํ์ ์ค์ ์์๋ ํ์ด์ง์ ์ ๊ทผํ๋ฉด ํ์ด์ง ํดํธ ์์ธ๊ฐ ๋ฐ์ํ๋ค. ๋์คํฌ์์ ๋๋ฝ๋ ํ์ด์ง๋ฅผ ๋ค์ ๋ถ๋ฌ์ ํ๋ก๊ทธ๋จ์ ์ฌ๊ฐํด์ ์ด์์ฒด์ ๊ฐ ๋์ํ ์ ์๊ฒ ํ๋ค.์ฐ๊ธฐ ๊ฐ๋ฅ
๊ณผ์คํ ๊ธ์ง
ํ๋๊ทธ๋ ํ์ด์ง์ ๋ด์ฉ์ด ์ฐ๊ธฐ ๊ฐ๋ฅํ๊ฑฐ๋ ์คํ ๊ฐ๋ฅํ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ค.์ ๊ทผ๋จ
๊ณผ๋ํฐ
ํ๋๊ทธ๋ ํ์ด์ง์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฐ์ ์ CPU์ ์ํด ์๋์ผ๋ก ์ค์ ๋๋ค. ์ด์ ์ฒด์ ๋ ์ด ์ ๋ณด๋ฅผ ํ์ฉํด์ ์ค์ ์์ํ ํ์ด์ง๋ฅผ ๊ฒฐ์ ํ๊ฑฐ๋ ๋ง์ง๋ง ๋์คํฌ ์ ์ฅ ์ดํ ํ์ด์ง ๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋์ง ํ์ธํ๋ค.์บ์๋ฅผ ํตํ ์ฐ๊ธฐ
๋์บ์ ํด์
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ํ์ด์ง์ ์บ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ดํ ์ ์๋ค.์ฌ์ฉ์ ์ ๊ทผ ๊ฐ๋ฅ
ํ๋๊ทธ๋ ์ฌ์ฉ์ ๊ณต๊ฐ ์ฝ๋์์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค. ์ค์ ์ด ์ ๋ ๊ฒฝ์ฐ, CPU๊ฐ ์ปค๋ ๋ชจ๋์ธ ๊ฒฝ์ฐ์๋ง ํ์ด์ง์ ์ ๊ทผํ ์ ์๋ค. ์ด ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ์ปค๋์ ๋งคํํด์ ์์คํ ํธ์ถ ์๋๋ฅผ ๋์ด๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค. ์คํํฐ ์ทจ์ฝ์ ์ด ์ฌ์ฉ์ ๊ณต๊ฐ ํ๋ก๊ทธ๋จ์ด ์ปค๋ ๋ชจ๋์ฉ ํ์ด์ง๋ฅผ ์ฝ์ ์ ์๊ฒ ํ๋ค.์ ์ญ
ํ๋๊ทธ๋ ๋ชจ๋ ์ฃผ์ ๊ณต๊ฐ์์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๋ฆฌ๋ฏ๋ก ์ฃผ์ ๊ณต๊ฐ ์ค์์น์ ๋ณํ ์บ์์์ ์ ๊ฑฐํ ํ์๊ฑฐ ์๋ค(์๋ TTLB ์น์ ์์ ๋ค๋ฃธ). ์ผ๋ฐ์ ์ผ๋ก์ ์ญ
ํ๋๊ทธ๋ ์ปค๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ฃผ์ ๊ณต๊ฐ์ ๋งคํํ๊ธฐ ์ํด์ ์ ์ ๊ทผ ๊ฐ๋ฅ
ํ๋๊ทธ์ ํจ๊ป ์ฌ์ฉ๋๋ค.ํฐ ํ์ด์ง
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋ฒจ 2๋ ๋ ๋ฒจ 3 ํ์ด์ง ํ ์ด๋ธ์ ํญ๋ชฉ์ด ๋งตํ๋ ํ๋ ์์ ์ง์ ๊ฐ๋ฆฌํค๊ฒ ํด์ ๋ ํฐ ํฌ๊ธฐ์ ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๊ฒ ํ๋ค.ํฐ ํ์ด์ง
ํ๋๊ทธ๊ฐ ์ค์ ๋๋ฉด, ํ์ด์ง ํฌ๊ธฐ๋ฅผ 512๋ฐฐ ๋๋ฆด ์ ์๋ค. ๋ ๋ฒจ 2 ํญ๋ชฉ์ 512 _ 4KB = 2MB, ๋ ๋ฒจ 3 ํญ๋ชฉ์ 512 _ 2MB = 1GB ํฌ๊ธฐ์ ํ์ด์ง๋ฅผ ๊ฐ๊ฒ ๋๋ค. ํ์ด์ง ํฌ๊ธฐ๊ฐ ํฌ๋ฉด ๋ณํ ์บ์์ ํ์ด์ง ์ฌ์ฉ๋๊ณผ ์ค์ด๋๋ ์ฅ์ ์ด ์๋ค.
x86_64
ํฌ๋ ์ดํธ๋ ํ์ด์ง ํ
์ด๋ธ๊ณผ ํ์ด์ง ํญ๋ชฉ์ ํํํ๋ ํ์
์ ์ ๊ณตํ๋ฏ๋ก, ํ์ด์ง์ ์ฌ์ฉํ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ง ์์๋ ๋๋ค.
4๋จ ํ์ด์ง ํ ์ด๋ธ์ ๊ฐ์ ์ฃผ์ ๋ณํ์ ๊ฐ ๋ณํ ๋น ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ 4๋ฒ์ฉ ํด์ผ ํ๋ฏ๋ก ๋น์ฉ์ด ํฌ๋ค. x86_64 ์ํคํ ์ฒ๋ ์ฑ๋ฅ ํฅ์์ ์ํด ๋ณํ ์์ธ ๋ฒํผ์ ๋ง์ง๋ง ๋ณํ ๋ช ๊ฐ๋ฅผ ์บ์ ํ๋ค. ๋ฒํ์ด ์บ์ ๋์ด์์ผ๋ฉด ๋ณํ ๊ณผ์ ์ ๊ฑด๋๋ธ ์ ์๋ค.
๋ค๋ฅธ CPU ์บ์์ ๋ฌ๋ฆฌ, TLB๋ ์์ ํ ํฌ๋ช
ํ์ง ์๊ณ ํ์ด์ง ํ
์ด๋ธ์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ ๋ ๋ณํ์ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์๋๋ค. ์ฆ, ์ปค๋์ด ํ์ด์ง ํ
์ด๋ธ์ ๋ณ๊ฒฝํ ๋๋ง๋ค TLB๋ ์ง์ ์
๋ฐ์ดํธํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด TLB์์ ํน์ ํ์ด์ง์ ๋ณํ์ ์ ๊ฑฐํด์ ๋ค์ ์ ๊ทผ ์ ํ์ด์ง ํ
์ด๋ธ์ ๋ค์ ๋ก๋ํ๊ฒ ํ๋ invlpg
("invalidate page")๋ผ๋ CPU ๋ช
๋ น์ด๊ฐ ์๋ค. ๋ํ, ์ฃผ์ ๊ณต๊ฐ ์ค์์น๋ฅผ ์๋ฎฌ๋ ์ดํธ ํ๋ CR3
๋ ์ง์คํฐ๋ฅผ ์๋ก๊ณ ์นจํด์ TLB๋ฅผ ์์ ํ ๋น์ธ ์ ์๋ค. x86_64
ํฌ๋ ์ดํธ๋ tlb
module์ ํตํด invlpg
์ CR3
๋ฅผ ์๋ก๊ณ ์นจํ๋ ํจ์๋ฅผ ๋ชจ๋ ์ ๊ณตํ๋ค.
ํ์ด์ง ํ ์ด๋ธ์ ๋ณ๊ฒฝํ ๋๋ง๋ค TLB๋ฅผ ๋น์ฐ๋ ๊ฒ ์ค์ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด CPU๊ฐ ์ด์ ๋ณํ์ ๊ณ์ ์ฌ์ฉํด์ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ๋น๊ฒฐ์ ์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๊ณ ๋ณด๋ฉด ์ปค๋์ ์ด๋ฏธ ํ์ด์ง์ ์ฌ์ฉํ๊ณ ์๋ค. ์์ฃผ ์์ ๋ฌ์คํธ ์ปค๋์์ ๋ชจ๋ ์ปค๋์ ํ์ด์ง๋ฅผ ๋ฌผ๋ฆฌ ํ๋ ์์ ๋งคํํ๋ 4๋จ ํ์ด์ง ๊ณ์ธต์ ์ค์ ํ๋ค. x86_64 64๋นํธ ๋ชจ๋์์ ํ์ด์ง์ ํ์์ด๋ฏ๋ก ๋ถํธ๋ก๋๊ฐ ํ์ด์ง ์ค์ ์ ํด๋จ๋ค.
๊ทธ๋์ ์ปค๋์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๊ฐ์ ์ฃผ์์ด๋ค. 0xb8000
์ฃผ์์ VGA ๋ฒํผ์ ์ ๊ทผํ๋ ๊ฒ๋ ๋ถํธ๋ก๋๊ฐ ๊ฐ์ ํ์ด์ง 0xb8000
์ ๋ฌผ๋ฆฌ ํ๋ ์ 0xb8000
์ ๋งคํํ ๋๋ถ์ ๊ฐ๋ฅํ๋ค.
ํ์ด์ง์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์์์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๋ ๋์ ํ์ด์ง ํดํธ๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ์ปค๋์ ๋น๊ต์ ์์ ํ๊ฒ ๋ง๋ ๋ค. ๋ํ, ๋ถํธ๋ก๋๋ ํ์ด์ง์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๊ถํ์ ์ค์ ํด์ ์ฝ๋๊ฐ ๋ค์ด์๋ ํ์ด์ง๋ง ์คํํ ์ ์๊ณ ๋ฐ์ดํฐ ํ์ด์ง์๋ง ์ธ ์ ์๊ฒ ํ๋ค.
์ปค๋ ๋ฐ์ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ ํ์ด์ง ํดํธ๋ฅผ ์ผ์ผ์ผ๋ณธ๋ค. ์ฐ์ , ํ์ด์ง ํดํธ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ง๋ค์ด์ IDT์ ๋ฑ๋กํ๋ค. ์ด๋ฅผ ํตํด ๋๋ธ ํดํธ ๋์ ์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค.
// src/interrupts.rs ๋ด๋ถ
lazy_static! {
static ref IDT: InterruptDescriptorTable = {
let mut idt = InterruptDescriptorTable::new();
[โฆ]
idt.page_fault.set_handler_fn(page_fault_handler); // new
idt
};
}
use x86_64::structures::idt::PageFaultErrorCode;
use crate::hlt_loop;
extern "x86-interrupt" fn page_fault_handler(
stack_frame: &mut InterruptStackFrame,
error_code: PageFaultErrorCode,
) {
use x86_64::registers::control::Cr2;
println!("EXCEPTION: PAGE FAULT");
println!("Accessed Address: {:?}", Cr2::read());
println!("Error Code: {:?}", error_code);
println!("{:#?}", stack_frame);
hlt_loop();
}
ํ์ด์ง ํดํธ ๋ฐ์ ์ CPU์ ์ํด ์๋์ผ๋ก ์ค์ ๋๋ CR2
๋ ์ง์คํฐ๋ ์ ๊ทผ๋ผ์ ํ์ด์ง ํดํธ๋ฅผ ๋ฐ์์ํจ ๊ฐ์ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค. x86_64
ํฌ๋ ์ดํธ์ Cr2::read
ํจ์๋ก CR2
๋ ์ง์คํฐ๋ฅผ ์ฝ๊ณ ์ถ๋ ฅํ๋ค. PageFaultErrorCode
ํ์
์ ํ์ด์ง ํดํธ๋ฅผ ์ผ์ผํจ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ข
๋ฅ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ๋ฌธ์ ๋ฅผ ์ผ์ผํจ ์ฐ์ฐ์ด ์ฝ๊ธฐ์ธ์ง ์ฐ๊ธฐ์ธ์ง ๋ฑ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก ์ถ๋ ฅํ๋ค. ํ์ด์ง ํดํธ ํด๊ฒฐ ์ ๊น์ง ์คํ์ ์ฌ๊ฐํ ์ ์์ผ๋ฏ๋ก ๋ง์ง๋ง์ hlt_loop
์ ๋ค์ด๊ฐ๋ค.
์ปค๋ ์ธ๋ถ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด๋ณธ๋ค.
// src/main.rs ๋ด๋ถ
#[no_mangle]
pub extern "C" fn _start() -> ! {
println!("Hello World{}", "!");
blog_os::init();
// ์๋ก ์ถ๊ฐ
let ptr = 0xdeadbeaf as *mut u32;
unsafe { *ptr = 42; }
// ์ ๊ณผ ๊ฐ์
#[cfg(test)]
test_main();
println!("It did not crash!");
blog_os::hlt_loop();
}
์ปค๋ ์คํ ์ ํ์ด์ง ํดํธ ์ฒ๋ฆฌ ํจ์๊ฐ ์คํ๋๋ค.
CR2
๋ ์ง์คํฐ๋ ์ ๊ทผ์ ์๋ํ 0xdeadbeaf
์ฃผ์๋ฅผ ๋ด๊ณ ์๋ค. ์๋ฌ ์ฝ๋๊ฐ ๋ด๊ณ ์๋ CAUSED_BY_WRITE
๋ฅผ ํตํด ์ฐ๊ธฐ ์์
์คํ์ ํ๋ ์ค์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ค์ ๋์ง ์์ ๋นํธ๋ฅผ ํตํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด PROTECTION_VIOLATION
ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์๋ค๋ ๊ฒ์ ํด๋น ํ์ด์ง๊ฐ ์์ด์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค๋ ๋ป์ด๋ค.
ํ์ฌ ๋ช
๋ น์ด ํฌ์ธํฐ๊ฐ 0x2031b2
์ด๋ฏ๋ก, ์ด ์ฃผ์๋ ์ฝ๋ ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฝ๋ ํ์ด์ง๋ ๋ถํธ๋ก๋์ ์ํด ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋งคํ๋๋ฏ๋ก ์ด ์ฃผ์๋ฅผ ์ฝ์ ์๋ ์์ง๋ง, ์ฐ๋ฉด ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค. 0xdeadbeaf
ํฌ์ธํฐ๋ฅผ 0x2031b2
๋ฐ๊ฟ์ ์คํํด๋ณผ ์ ์๋ค.
// ์ฃผ์: ์ค์ ์ฃผ์๋ ํ๊ฒฝ๋ง๋ค ๋ค๋ฅผ ์ ์์
// ํ์ด์ง ํดํธ ์ฒ๋ฆฌ ํจ์๊ฐ ํ์ํ๋ ์ฃผ์๋ฅผ ์ฌ์ฉํ ๊ฒ
let ptr = 0x2031b2 as *mut u32;
// ์ฝ๋ ํ์ด์ง ์ฝ๊ธฐ
unsafe { let x = *ptr; }
println!("์ฝ๊ธฐ ์ฑ๊ณต");
// ์ฝ๋ ํ์ด์ง์ ์ฐ๊ธฐ
unsafe { *ptr = 42; }
println!("์ฐ๊ธฐ ์ฑ๊ณต");
๋ง์ง๋ง ์ค์ ์ฃผ์ ์ฒ๋ฆฌํ๋ฉด ์ฝ๊ธฐ ์ ๊ทผ์ ์ ์ ์๋ํ์ง๋ง, ์ฐ๊ธฐ ์ ๊ทผ ์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค.
![code-page-write-access]](https://user-images.githubusercontent.com/22253556/81690949-04d10080-9497-11ea-94e5-3cc5863d6796.png)
"์ฝ๊ธฐ ์ฑ๊ณต" ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์ด ์ฝ๊ธฐ ์์
์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์์ ์ ์ ์๋ค. ๊ทธ๋ฌ๋ "์ฐ๊ธฐ ์ฑ๊ณต" ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ ๋์ ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฒ์๋ PROTECTION_VIOLATION
ํ๋๊ทธ๊ฐ CAUSED_BY_WRITE
ํ๋๊ทธ์ ํจ๊ป ์ค์ ๋ผ์ ํ์ด์ง๊ฐ ์์ง๋ง, ํ์ฉ๋์ง ์์ ์ฐ์ฐ์ด ์คํ๋์์ ์ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ์ฝ๋ ํ์ด์ง๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋งคํ๋๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ฐ๊ธฐ๊ฐ ํ์ฉ๋์ง ์์๋ค.
์ปค๋ ๋งคํ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ํ์ด์ง ํ ์ด๋ธ์ ์ดํด๋ณธ๋ค.
// src/main.rs ๋ด๋ถ
#[no_mangle]
pub extern "C" fn _start() -> ! {
println!("Hello World{}", "!");
blog_os::init();
use x86_64::registers::control::Cr3;
let (level_4_page_table, _) = Cr3::read();
println!("Level 4 page table at: {:?}", level_4_page_table.start_address());
[โฆ] // test_main(), println(โฆ), and hlt_loop()
}
x86_64
์ Cr3::read
ํจ์๋ CR3
๋ ์ง์คํฐ์์ ํ์ฌ ํ์ฑํ๋ ๋ ๋ฒจ 4 ํ์ด์ง ํ
์ด๋ธ์ ๋ฐํํ๋ค. Cr3::read()
์ PhysFrame
๊ณผ Cr3Flags
ํ์
์ ํํ์ ๋ฐํํ๋ค. ํ๋ ์๋ง ์ดํด๋ณด๊ณ ์ถ์ผ๋ฏ๋ก ํํ์ ๋ ๋ฒ์งธ ์์๋ ๋ฌด์ํ๋ค.
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
Level 4 page table at: PhysAddr(0x1000)
ํ์ฌ ํ์ฑํ๋ ๋ ๋ฒจ 4 ํ
์ด๋ธ์ด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ 0x1000
์ฃผ์์ ์ ์ฅ๋์ด ์๊ณ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ PhysAddr
๋ํผ ํ์
์ผ๋ก ํ์๋๋ค. ์ปค๋์์ ์ด ํ
์ด๋ธ์ ์ ๊ทผํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ๋ฅผ ์ฐํํ๊ณ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด, ํ์ด์ง ์ฌ์ฉ ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ํ
์ด๋ธ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์ฃผ์ 0x1000
์ ๋ฌผ๋ฆฌ ํ๋ ์์ ๋งคํ๋ ์ผ๋ถ ๊ฐ์ ํ์ด์ง๋ฅผ ํตํด์ผ ํ๋ค. ํ์ด์ง ํ
์ด๋ธ ํ๋ ์์ฉ ๋งคํ ์์ฑ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ค. ์๋ฅผ ๋ค์ด, ์ปค๋์ด ์ ์ค๋ ๋์ ์คํ์ ํ ๋นํ ๋ ํ์ด์ง ํ
์ด๋ธ์ ์ ๊ธฐ์ ์ผ๋ก ์ก์ธ์คํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ฌธ์ ๋ ๋ค์ ํฌ์คํธ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
์ด๋ฒ ์ฅ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ์ธ ์ธ๊ทธ๋จผํ ์ด์ ๊ณผ ํ์ด์ง์ ์๊ฐํ๋ค. ์ธ๊ทธ๋จผํ ์ด์ ์ ๊ฐ๋ณํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ญ์ ์ฌ์ฉํ๊ณ ์ธ๋ถ ํํธํ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์ด ์๋ค. ํ์ด์ง์ ๊ณ ์ ํฌ๊ธฐ์ ํ์ด์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ ๊ทผ ๊ถํ ์ ์ด๋ฅผ ๋ ์ธ๋ฐํ๊ฒ ํ ์ ์๋ค.
ํ์ด์ง์ 1๋จ ์ด์์ ํ์ด์ง ํ ์ด๋ธ์ ํ์ด์ง ๋งคํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. x86_64 ์ํคํ ์ฒ๋ 4๋จ ํ์ด์ง ํ ์ด๋ธ์ ์ฌ์ฉํ๊ณ ํ์ด์ง ์ฌ์ด์ฆ๋ 4KB์ด๋ค. ํ๋์จ์ด๊ฐ ์๋์ผ๋ก ํ์ด์ง ํ ์ด๋ธ์ ๋ฐ๋ผ ์ด๋ํ๊ณ ๋ณํ ๊ฒฐ๊ณผ๋ ๋ณํ ์์ธ ๋ฒํผ(TLB)์ ์บ์ ํ๋ค. ๋ณํ ์์ธ ๋ฒํผ๋ ํฌ๋ช ํ๊ฒ ์ ๋ฐ์ดํธ๋์ง ์์ผ๋ฏ๋ก ํ์ด์ง ํ ์ด๋ธ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ๋น์์ผ ํ๋ค.
์ปค๋์ด ์ด๋ฏธ ํ์ด์ง ์์์ ์คํ๋๊ณ ์์ผ๋ฉฐ ๋ถ๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ํ์ด์ง ํดํธ ์์ธ๋ฅผ ์ผ์ผํจ๋ค. ํ์ฌ ํ์ฑํ๋ ํ์ด์ง ํ ์ด๋ธ์ ์ ๊ทผํ๋ ค๊ณ ํ์ง๋ง, CR3 ๋ ์ง์คํฐ๊ฐ ์ปค๋์์ ์ง์ ์ ๊ทผํ ์ ์๋ ๋ฌผ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๊ณ ์์ด์ ํ์ด์ง ํ ์ด๋ธ์ ์ ๊ทผํ ์ ์์๋ค.