๐ก๋ชฉํ
๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ด์ง๋ฅผ ๊ตฌํ
anonymous page์๋ ๋ฌ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ด์ง๋ ํ์ผ ๋ฐฑ์ ๋งคํ์ ์งํ
*๊ด๋ จ ์ด๋ก ์ ๋ฆฌ
ํ์ด์ง ํดํธ๊ฐ ์ผ์ด๋๋ฉด ๋ฐ๋ก ๋ฌผ๋ฆฌ ํ๋ ์์ด ํ ๋น๋๊ณ ๋ฌผ๋ฆฌ ํ๋ ์์ ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋๋๋ฐ,
DMA ๋ฐฉ์์ผ๋ก ๋์คํฌ์์ ํ์ผ์ ์ฝ์ด์์ ๋ณต์ฌํ๋ค.
mmap()
๋ฐฉ์
ํ์ผ ๋์คํฌ๋ฝํฐ(fd)๋ก ์ด๋ฆฐ ํ์ผ์ ์คํ์ (offset)๋ถํฐ ์์ํด์ ๊ธธ์ด(length) ๋งํผ์ ๋ฐ์ดํธ๋ฅผ ํ๋ก์ธ์ค์ ๊ฐ์์ฃผ์ ๊ณต๊ฐ์ ์ฃผ์ด์ง ์ฃผ์(addr)๋ถํฐ ๋งคํํ๋ค.
munmap()
๋ฐฉ์
์ฃผ์ด์ง ์ฃผ์ ๋ฒ์ addr์ ๋ํ ๋งคํ์ ํด์ ํ๋ค. ์ด๋ ๋งคํ๋ ํ์ผ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ์ง ์์ ๋ ์ด ํจ์๋ฅผ ํธ์ถํ๋ค.
DMA ๋ฐฉ์
mmap
and munmap
1-1. void *mmap (void *addr, size_t length, int writable, int fd, off_t offset);
์ด ํจ์์์๋ ์ธ์๋ค์ ๊ฒ์ฆํด์ฃผ๊ณ
do_mmap()
์์ ์ค์ง์ ์ธ mmap์ ์ํ
- ๊ฒ์ฆํ ๋ ๊ณ ๋ คํด์ค ์ฌํญ
(1) addr๊ฐ ์๋ ๊ฒฝ์ฐ
(2) addr๊ฐ page-aligned ๋์ง ์์ ๊ฒฝ์ฐ
(3) offset์ด page-aligned๋์ง ์์ ๊ฒฝ์ฐ
(4) addr๊ฐ user ์์ญ์ด ์๋ ๊ฒฝ์ฐ
(5) addr + length๊ฐ user ์์ญ์ด ์๋ ๊ฒฝ์ฐ
(addr๋ถํฐ ํ์ผ์ ๋ด์ฉ์ ๋งคํํด๋๊ฐ๋ฉด ๋ง์ง๋ง ์ฃผ์๋ addr+length๊ฐ ๋๋๋ฐ, ์ด ์ฃผ์๋ user ์์ญ ์์ ์กด์ฌํด์ผ ํ๋ค.)
(6) addr์ ํ ๋น๋ ํ์ด์ง๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ
(7) fd์ ํด๋นํ๋ file์ด ์๋ ๊ฒฝ์ฐ
(8) file์ ๊ธธ์ด๊ฐ 0์ด๊ฑฐ๋ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ
1-2. void* do_mmap (void *addr, size_t length, int writable, struct file *file, off_t offset);
load_segment() ํจ์์ ์ ์ฌํ๊ฒ ๊ตฌ์ฑ, ์ด๋ ๋ค๋ฅธ ์ ์ vm_file๋ก initializer ํด์ค๋ค๋ ์ ์ด๋ค.
load_segment()
์ ๋น์ทํ๊ฒ ์ ์ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ฌ ํ์ด์ง ํดํธ๊ฐ ์ผ์ด๋๋ฉด vm_alloc_page_with_initializer->uninit_new()->uninit_initialize-> file_initializer->lazy_load_segment() ๊ณผ์ ์ ์คํํ๊ฒ ๋์ด ๋ฌผ๋ฆฌ ํ๋ ์์ ๋ณต์ฌํ๊ฒ ๋๋ค.
2-1. void munmap (void *addr);
return do_munmap
์ ํธ์ถํด์ฃผ๋ฉด ๋๋ค.
2-2. void do_munmap (void *addr)
mmap์์ ์ฐ๊ฒฐํ๋ ๋ฌผ๋ฆฌ ํ๋ ์๊ณผ์ ์ฐ๊ฒฐ์ ๋๋ ํจ์์ด๋ค.
spt์ ์ ์ฅ๋ page๋ค ์ค ํด๋นํ๋ page๋ฅผ ์ฐพ๊ณ destory() ํจ์๋ฅผ ์ด์ฉํด page์ ๋ฌผ๋ฆฌ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๋งคํ์ ํด์ ํ๋ค.
munmap
๊ณผmmap
์ ์คํ ํด์ฃผ๊ธฐ ์ํด์๋ system call handler์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
bool file_backed_initializer(struct page *page, enum vm_type type, void *kva)
๋งคํ๋ ํ์ผ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํจ์๋ก ๋งคํ์ ํด์ ํ ๋ ํด๋นํ๋ ํ์ผ์ ์ฐพ๊ธฐ ์ํด ์ฌ๋ฐ๋ฅธ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
file_backed_destroy(struct page *page)
๋งคํ์ด ํด์ ๋์ด์ผ ํ๋ฏ๋ก ์์ ์ฌํญ์ ํ์ผ์ ๋ฐ์ํ๊ณ ๊ฐ์ ํ์ด์ง ๋ชฉ๋ก์์ ํ์ด์ง์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ๋งคํ์ ์ ๊ฑฐํ๋ค.
๐ก ์ด๋ ์์๋์ด์ผ ํ ์ ์ pml4_clear_page
ํจ์๊ฐ page ์์ฒด๋ฅผ ์ญ์ ์ํค๋ ํจ์๊ฐ ์๋๋ผ ํ์ด์ง์ ๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํ์ํจ๋ค๋ ๊ฒ์ ์ด์ ์ ๋์ด์ผ ํ๋ค.
์ด์ ๊ด๋ จ๋ ์ค๋ฅ ๋ณด๋ฌ๊ฐ๊ธฐ -> ๋ธ๋ฃจํด๋ฝ 1ํ
bool supplemental_page_table_copy(struct supplemental_page_table *dst UNUSED,struct supplemental_page_table *src UNUSED)
์์ ํ์ด์ง๊ฐ ๋ถ๋ชจ์ํ๋ ์๊ณผ ๋งคํ๋๋๋ก ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
์ด๋ "src"๋ก๋ถํฐ "dst"๋ก ๋ณด์กฐ ํ์ด์ง ํ ์ด๋ธ์ ๋ณต์ฌํ๋ ์์ ์ ํ๋๋ฐ ์ด๋ src๋ ๋ณต์ฌํ ๋์์ด ๋๋ ๋ณด์กฐ ํ์ด์ง ํ ์ด๋ธ,dst๋ ๋ณต์ฌ๋ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋ ๋ณด์กฐ ํ์ด์ง ํ ์ด๋ธ
์ด ํจ์์์ type==VM_FILE์ผ๋ table ๋ณต์ ๋ฅผ ํด์ฃผ๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ load_segment()
์์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด ์ฝ๋์ ๋น์ทํ๊ฒ ๊ตฌ์ฑํ๊ณ page๊ฐ ํ ๋น๋์ด ์๋ page์ธ์ง ํ์ธํ๋ค. ๊ทธ ํ file_backed_initializer()ํจ์๋ฅผ ์ด์ฉํด ์ด๊ธฐํํด์ฃผ๊ณ page๋ฅผ frame->kva์ ๋ฃ์ด์ค๋ค.