[TIL] [WEEK9-10] Pintos Project(2) User Memory Access

woo__jยท2024๋…„ 6์›” 2์ผ
0

Pintos Project

๋ชฉ๋ก ๋ณด๊ธฐ
5/14

๐Ÿ“๋‘ ๋ฒˆ์งธ ๊ณผ์ œ, User Memory Access (์œ ์ € ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ)

์‹œ์Šคํ…œ ์ฝœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด, ์œ ์ € ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์ธ์ž๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” ์ด ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, ์‹œ์Šคํ…œ ์ฝœ์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ํฌ์ธํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•  ๋•Œ๋ผ๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์จ์•ผ ํ•œ๋‹ค.

์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์ผ๋ถ€๋กœ ์ปค๋„์€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•œ๋‹ค. ์ด ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ 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);
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด