pintos-Memory Mapped Files ๊ตฌํ˜„

developer_jenniferยท2023๋…„ 6์›” 22์ผ
0

ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€

๋ชฉ๋ก ๋ณด๊ธฐ
24/29

Memory Mapped Files(File Backed mapping)

๐Ÿ’ก๋ชฉํ‘œ
๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘๋œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„
anonymous page์™€๋Š” ๋‹ฌ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘ ํŽ˜์ด์ง€๋Š” ํŒŒ์ผ ๋ฐฑ์—… ๋งคํ•‘์„ ์ง„ํ–‰

*๊ด€๋ จ ์ด๋ก  ์ •๋ฆฌ
ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„์ด ํ• ๋‹น๋˜๊ณ  ๋ฌผ๋ฆฌ ํ”„๋ ˆ์ž„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋˜๋Š”๋ฐ,
DMA ๋ฐฉ์‹์œผ๋กœ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ์„ ์ฝ์–ด์™€์„œ ๋ณต์‚ฌํ•œ๋‹ค.

  • mmap() ๋ฐฉ์‹

    ํŒŒ์ผ ๋””์Šคํฌ๋Ÿฝํ„ฐ(fd)๋กœ ์—ด๋ฆฐ ํŒŒ์ผ์„ ์˜คํ”„์…‹(offset)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ธธ์ด(length) ๋งŒํผ์˜ ๋ฐ”์ดํŠธ๋ฅผ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ€์ƒ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ฃผ์–ด์ง„ ์ฃผ์†Œ(addr)๋ถ€ํ„ฐ ๋งคํ•‘ํ•œ๋‹ค.

  • munmap() ๋ฐฉ์‹

    ์ฃผ์–ด์ง„ ์ฃผ์†Œ ๋ฒ”์œ„ addr์— ๋Œ€ํ•œ ๋งคํ•‘์„ ํ•ด์ œํ•œ๋‹ค. ์ด๋•Œ ๋งคํ•‘๋œ ํŒŒ์ผ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  • DMA ๋ฐฉ์‹

1. 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์™€ ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์˜ ๋งคํ•‘์„ ํ•ด์ œํ•œ๋‹ค.

system call ์ˆ˜์ •

munmap๊ณผ mmap์„ ์‹คํ–‰ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” system call handler์— ์„ค์ • ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Unmapping ์ถ”๊ฐ€ ํ•จ์ˆ˜

  1. bool file_backed_initializer(struct page *page, enum vm_type type, void *kva)

    ๋งคํ•‘๋œ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋งคํ•‘์„ ํ•ด์ œํ• ๋•Œ ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์˜ฌ๋ฐ”๋ฅธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  2. file_backed_destroy(struct page *page)

    ๋งคํ•‘์ด ํ•ด์ œ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜์ •์‚ฌํ•ญ์„ ํŒŒ์ผ์— ๋ฐ˜์˜ํ•˜๊ณ  ๊ฐ€์ƒ ํŽ˜์ด์ง€ ๋ชฉ๋ก์—์„œ ํŽ˜์ด์ง€์™€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์™€์˜ ๋งคํ•‘์„ ์ œ๊ฑฐํ•œ๋‹ค.

๐Ÿ’ก ์ด๋•Œ ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์€ pml4_clear_page ํ•จ์ˆ˜๊ฐ€ page ์ž์ฒด๋ฅผ ์‚ญ์ œ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ดˆ๊ธฐํ™”์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋‘์–ด์•ผ ํ•œ๋‹ค.

์ด์™€ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ -> ๋ธ”๋ฃจํด๋Ÿฝ 1ํŒ€

  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์— ๋„ฃ์–ด์ค€๋‹ค.

profile
๋ธ”๋กœ๊ทธ ์ด์ „ํ•ฉ๋‹ˆ๋‹ค -> https://heekyoung2000.tistory.com/

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

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