mremap(2) - wariua/manpages-ko GitHub Wiki
mremap - ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ฌ์ฌ์ํ๊ธฐ
#define _GNU_SOURCE /* feature_test_macros(7) ์ฐธ๊ณ */
#include <sys/mman.h>
void *mremap(void *old_address, size_t old_size,
size_t new_size, int flags, ... /* void *new_address */);
mremap()
์ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ๋งคํ์ ํ์ฅ(๋๋ ์ถ์)ํ๋ฉฐ, ๋์์ ์ฎ๊ธฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. (flags
์ธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ๋ฐ๋ผ ์ ํด์ง๋ค.)
old_address
๋ ํ์ฅ(๋๋ ์ถ์)ํ๋ ค๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด์ ์ฃผ์์ด๋ค. old_address
๊ฐ ํ์ด์ง์ ์ ๋ ฌ๋์ด ์์ด์ผ ํจ์ ์ ์ํด์ผ ํ๋ค. old_size
๋ ๊ทธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ด์ ํฌ๊ธฐ์ด๋ค. new_size
๋ ๊ทธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์กฐ์ ํ์ ์์ฒญ ํฌ๊ธฐ์ด๋ค. ์ ํ์ ์ธ ๋ค์ฏ ๋ฒ์งธ ์ธ์ new_address
๋ฅผ ์ค ์๋ ์๋ค. ์๋ MREMAP_FIXED
์ค๋ช
์ ๋ณด๋ผ.
old_size
์ ๊ฐ์ด 0์ด๊ณ old_address
๊ฐ ๊ณต์ ๊ฐ๋ฅ ๋งคํ(mmap(2) MAP_SHARED
์ฐธ๊ณ )์ ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ์๋ mremap()
์ด ๋์ผ ํ์ด์ง๋ค๋ก ์ ๋งคํ์ ๋ง๋ค๊ฒ ๋๋ค. new_size
๊ฐ ์ ๋งคํ์ ํฌ๊ธฐ๊ฐ ๋๋ฉฐ ์ ๋งคํ์ ์์น๋ฅผ new_address
๋ก ์ง์ ํ ์๋ ์๋ค. ์๋ MREMAP_FIXED
์ค๋ช
์ ๋ณด๋ผ. ์ด ๋ฐฉ์์ผ๋ก ์ ๋งคํ์ ์์ฒญํ๋ ๊ฒฝ์ฐ์๋ MREMAP_MAYMOVE
ํ๋๊ทธ๋ ํจ๊ป ์ง์ ํด์ผ ํ๋ค.
๋ฆฌ๋ ์ค์์ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ด์ง๋ค๋ก ๋๋ ์ ธ ์๋ค. ์ฌ์ฉ์ ํ๋ก์ธ์ค์๋ (ํ ๊ฐ ๋๋) ์ฌ๋ฌ ๊ฐ์ ์ ํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๊ฐ ์๋ค. ๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ์๋ ์ค์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ๋ํ ํ ๊ฐ ๋๋ ๊ทธ ์ด์์ ๋งคํ์ด (ํ์ด์ง ํ ์ด๋ธ ๋ด์) ์๋ค. ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ์๋ ๊ฐ์์ ๋ณดํธ ๋ฐฉ์(์ ๊ทผ๊ถ)์ด ์์ด์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์๋ชป๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ฉด (๊ฐ๋ น ์ฝ๊ธฐ ์ ์ฉ ์ธ๊ทธ๋จผํธ์ ์ฐ๊ธฐ) ์ธ๊ทธ๋ฉํ ์ด์ ์๋ฐ์ด ๋ฐ์ํ ์ ์๋ค. ์ธ๊ทธ๋จผํธ ๋ฐ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด๋ ์ธ๊ทธ๋ฉํ ์ด์ ์๋ฐ์ด ๋ฐ์ํ๊ฒ ๋๋ค.
mremap()
์ ๋ฆฌ๋
์ค์ ํ์ด์ง ํ
์ด๋ธ ์ฒด๊ณ๋ฅผ ์ด์ฉํ๋ค. mremap()
์ ๊ฐ์ ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ๊ฐ์ ๋งคํ์ ๋ฐ๊พผ๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด ์์ฃผ ํจ์จ์ ์ธ realloc(3)์ ๊ตฌํํ ์ ์๋ค.
flags
๋นํธ ๋ง์คํฌ ์ธ์๋ 0์ด๊ฑฐ๋ ๋ค์ ํ๋๊ทธ๋ฅผ ํฌํจํ ์ ์๋ค.
MREMAP_MAYMOVE
- ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ์์น์์ ๋งคํ์ ํ์ฅํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์์ผ๋ฉด
mremap()
์ด ์คํจํ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ํ์์ ์ปค๋์์ ๋งคํ์ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ ํ์ฉํ๋ค. ๋งคํ์ด ์ฌ๋ฐฐ์น๋๋ฉด ์ด์ ๋งคํ ์์น์ ๋ํ ์ ๋ ํฌ์ธํฐ๊ฐ ์ ํจํ์ง ์๊ฒ ๋๋ค. (๋งคํ ์์ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํ์ ์ ์ฐ๋ ๊ฒ ์ข๋ค.) -
MREMAP_FIXED
(๋ฆฌ๋ ์ค 2.3.31๋ถํฐ) - ์ด ํ๋๊ทธ๋ mmap(2)์
MAP_FIXED
ํ๋๊ทธ์ ๋น์ทํ ์ญํ ์ ํ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉดmremap()
์ด ๋ค์ฏ ๋ฒ์งธ ์ธ์void *new_address
๋ฅผ ๋ฐ๋๋ฐ ๊ทธ ์ธ์๋ ๋งคํ์ ์ด๋์ํฌ ํ์ด์ง ์ ๋ ฌ ์ฃผ์๋ฅผ ๋ํ๋ธ๋ค.new_address
์new_size
๋ก ์ง์ ํ ์ฃผ์ ๋ฒ์์ ๊ธฐ์กด ๋งคํ์ด ์์ผ๋ฉด ๋งต์ ํด์ ํ๋ค.MREMAP_FIXED
๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐMREMAP_MAYMOVE
๋ ํจ๊ป ์ง์ ํด์ผ ํ๋ค.
old_address
์ old_size
๋ก ์ง์ ํ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๊ฐ (mlock(2) ๋ฑ์ผ๋ก) ์ ๊ฒจ ์์ผ๋ฉด ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ ์กฐ์ ๋ฐ/๋๋ ์ฌ๋ฐฐ์น ๊ณผ์ ์์ ๊ทธ ์ ๊น์ด ์ ์ง๋๋ค. ๊ทธ์ ๋ฐ๋ผ ํ๋ก์ธ์ค์ ์ํด ์ ๊ธด ๋ฉ๋ชจ๋ฆฌ ์์ด ๋ฐ๋ ์ ์๋ค.
์ฑ๊ณต ์ mremap()
์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์ค๋ฅ ์ MAP_FAILED
(์ฆ (void *) -1
) ๊ฐ์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
EAGAIN
- ํธ์ถ์๊ฐ ์ ๊ธด ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๋ฅผ ํ์ฅํ๋ ค ํ๋๋ฐ
RLIMIT_MEMLOCK
์์ ์ ํ์ ์ด๊ณผํ์ง ์๊ณ ๋ ๋ถ๊ฐ๋ฅํ๋ค. EFAULT
- "์ธ๊ทธ๋ฉํ
์ด์
ํดํธ".
old_address
์์old_address+old_size
๊น์ง ๋ฒ์ ๋ด์ ์ด๋ค ์ฃผ์๊ฐ ์ด ํ๋ก์ธ์ค์๊ฒ ์ ํจํ์ง ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ด๋ค. ์์ฒญํ ์ฃผ์ ๊ณต๊ฐ ์ ์ฒด๋ฅผ ํฌ๊ดํ๋ ๋งคํ๋ค์ด ์กด์ฌํ์ง๋ง ๊ทธ ๋งคํ๋ค์ด ์๋ก ๋ค๋ฅธ ์ ํ์ธ ๊ฒฝ์ฐ์๋EFAULT
๋ฅผ ๋ฐ์ ์ ์๋ค. EINVAL
-
์ ํจํ์ง ์์ ์ธ์๋ฅผ ์ฃผ์๋ค. ๊ฐ๋ฅํ ์์ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
old_address
๊ฐ ํ์ด์ง์ ์ ๋ ฌ๋์ด ์์ง ์๋ค. -
flags
์MREMAP_MAYMOVE
์MREMAP_FIXED
์ธ์ ๊ฐ์ ์ง์ ํ๋ค. -
new_size
๊ฐ 0์ด๋ค. -
new_size
๋new_address
๊ฐ ์ ํจํ์ง ์๋ค. -
new_address
์new_size
๋ก ์ง์ ํ ์ ์ฃผ์ ๋ฒ์๊ฐold_address
์old_size
๋ก ์ง์ ํ ์ด์ ์ฃผ์ ๋ฒ์์ ๊ฒน์น๋ค. -
MREMAP_FIXED
๋ฅผ ์ง์ ํ๋ฉด์MREMAP_MAYMOVE
๋ฅผ ํจ๊ป ์ง์ ํ์ง ์์๋ค. -
old_size
๊ฐ 0์ธ๋ฐold_address
๊ฐ ๊ณต์ ๊ฐ๋ฅ ๋งคํ์ ๊ฐ๋ฆฌํค๊ณ ์์ง ์๋ค. (ํ์ง๋ง BUGS ์ฐธ๊ณ .) -
old_size
๊ฐ 0์ธ๋ฐMREMAP_MAYMOVE
ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์์๋ค.
-
ENOMEM
- ํ์ฌ ๊ฐ์ ์ฃผ์์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ์ฅํ ์ ์์ผ๋ฉฐ
flags
์MREMAP_MAYMOVE
๊ฐ ์ค์ ๋ผ ์์ง ์๋ค. ๋๋ ์ธ ์ ์๋ (๊ฐ์) ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถ์น ์๋ค.
์ด ํธ์ถ์ ๋ฆฌ๋ ์ค ์ ์ฉ์ด๋ฏ๋ก ์ด์์ฑ์ด ์์ด์ผ ํ๋ ํ๋ก๊ทธ๋จ์์๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค.
glibc ๋ฒ์ 2.4 ์ ์์๋ MREMAP_FIXED
์ ์๋ฅผ ๋
ธ์ถํ์ง ์์์ผ๋ฉฐ mremap()
์ํ์์ new_address
์ธ์๋ฅผ ํ์ฉํ์ง ์์๋ค.
mlock(2) ๋ฑ์ผ๋ก ์ ๊ทผ ์์ญ์ mremap()
์ผ๋ก ์ด๋ ๋ด์ง ํ์ฅํ๋ ๊ฒฝ์ฐ์ mremap()
ํธ์ถ์์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์์ญ์ ์ฑ์ฐ๋ ค๊ณ ์ต์ ์ ๋คํ๋ ์ฑ์ฐ๋ ๋ฐ ์คํจํ ๊ฒฝ์ฐ์ ENOMEM
์ผ๋ก ์คํจํ์ง ์๋๋ค.
๋ฆฌ๋
์ค 4.14 ์ ์์๋ old_size
๊ฐ 0์ด๊ณ old_address
๊ฐ ๊ฐ๋ฆฌํค๋ ๋งคํ์ด ๋น๊ณต์ ๋งคํ(mmap(2) MAP_PRIVATE
)์ด๋ฉด mremap()
์ด ์๋ ๋งคํ๊ณผ ๋ฌด๊ดํ ์ ๋น๊ณต์ ๋งคํ์ ์์ฑํ๋ค. ๊ทธ ๋์ ๋ฐฉ์์ ์๋ํ์ง ์์ ๊ฒ์ด๋ฉฐ ์๋ง ์ฌ์ฉ์ ๊ณต๊ฐ ์์ฉ์๊ฒ๋ (mremap()
์ ๋ชฉ์ ์ด ์๋ ๋งคํ์ ๋ฐํ์ผ๋ก ์ ๋งคํ์ ๋ง๋๋ ๊ฒ์ด๋ฏ๋ก) ์์์น ๋ชปํ ๋์์ด์์ ๊ฒ์ด๋ค. ๋ฆฌ๋
์ค 4.14๋ถํฐ๋ ๊ทธ ๊ฒฝ์ฐ์ mremap()
์ด EINVAL
์ค๋ฅ๋ก ์คํจํ๋ค.
brk(2), getpagesize(2), getrlimit(2), mlock(2), mmap(2), sbrk(2), malloc(3), realloc(3)
๋ฉ๋ชจ๋ฆฌ ํ์ด์ง์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ข์ํ๋ ์ด์ ์ฒด์ ๊ต๊ณผ์(๊ฐ๋ น Andrew S. Tanenbaum์ Modern Operating System, Randolf Bentson์ Inside Linux, Maurice J. Bach์ The Design of the UNIX Operating System)๋ฅผ ๋ณด๋ผ.
2019-03-06