์์คํ ์ฝ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด, ์ ์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผ ํ๋ค. ์ธ์๋ฅผ ๋ฐ์ ๋๋ ์ด ๋ฐฉ๋ฒ์ด ํ์ํ์ง ์์ง๋ง, ์์คํ ์ฝ์ ์ธ์๋ก ๋ค์ด์จ ํฌ์ธํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ผ ํ ๋๋ผ๋ฉด ์ด ๋ฐฉ๋ฒ์ ์จ์ผ ํ๋ค.
์์คํ ํธ์ถ์ ์ผ๋ถ๋ก ์ปค๋์ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ์ํด ์ ๊ณต๋๋ ํฌ์ธํฐ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ค. ์ด ๋, ์ฌ์ฉ์๊ฐ null ํฌ์ธํฐ๋ ๋งคํ๋์ง ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ, ์ปค๋ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
์ ํจํ์ง ์์ ํฌ์ธํฐ๋ค์ ์ปค๋์ด๋ ์คํ ์ค์ธ ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ํด๋ฅผ ๋ผ์น์ง ์๋๋ก ๋ฌธ์ ๊ฐ ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ณ ์์์ ํด์ ํด์ผ ํ๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ
1) ์ฌ์ฉ์๊ฐ ์ ๋ฌํ ํฌ์ธํฐ์ ์ ํจ์ฑ์ ํ์ธํ ํ ์ฐธ์กฐ ํด์ ํ๋ ๊ฒ
: mmu.c ๋ฐ vaddr.h์ ๊ด๋ จ ํจ์๊ฐ ์ ๊ณต๋จ
2) ์ฌ์ฉ์๊ฐ ์ ๋ฌํ ํฌ์ธํฐ๊ฐ KERN_BASE ์๋๋ฅผ ๊ฐ๋ฆฌํค๋์ง ํ์ธ ํ ์ฐธ์กฐ ํด์ ํ๋ ๊ฒ
: ์๋ชป๋ ํฌ์ธํฐ์๋ค๋ฉด page fault๋ฅผ ์ผ์ผํค๊ฒ ๋๊ณ , ์ด๋ page_fault()๋ก ์ฒ๋ฆฌํ๋ค.
(์ผ๋จ ํด๋น ๊ณผ์ ์์ page_fault()์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ง ์๋๋ค, ๊ทธ๋ฌ๋ exit(-1)๋ก ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋๋ก ์์ ํ์.)
ํด๋น ๊ณผ์ ๋ฅผ ์ํ ํจ์ ๊ตฌํ์ ์๋์ ๊ฐ๋ค.
void check_address(void *addr)
{
struct thread *current = thread_current();
if (!is_user_vaddr(addr) || addr == NULL || pml4_get_page(current->pml4, addr) == NULL)
{
exit(-1);
}
}