Manpages

名 前

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 は 要 求 す る 変 更 後 の 仮 想 メ モ リ ー ブ ロ ッ ク の サ イ ズ で あ る 。 5 番 目 の 引 き 数 と し て new_address を 指 定 す る こ と が で き る 。 下 記 の MREMAP_FIXED の 説 明 を 参 照 の こ と 。

Linux で は メ モ リ ー は ペ ー ジ に 分 割 さ れ る 。 ユ ー ザ ー プ ロ セ ス は (一 つ ま た は ) 複 数 の リ ニ ア な 仮 想 メ モ リ ー セ グ メ ン ト を 持 つ 。 そ れ ぞ れ の 仮 想 メ モ リ ー セ グ メ ン ト は 一 つ 以 上 の 実 メ モ リ ー ペ ー ジ に マ ッ ピ ン グ さ れ て い る (マ ッ ピ ン グ 情 報 は ペ ー ジ テ ー ブ ル で 管 理 さ れ る )。 仮 想 メ モ リ ー セ グ メ ン ト に は セ グ メ ン ト 毎 の 保 護 (ア ク セ ス 権 ) が 設 定 さ れ て お り 、 メ モ リ ー が 不 正 に ア ク セ ス さ れ た 場 合 (例 え ば 読 み 込 み 専 用 の セ グ メ ン ト に 書 き 込 ん だ 場 合 )、 セ グ メ ン テ ー シ ョ ン 侵 害 (segmentation violation) を 引 き 起 こ す 。 ま た 、 セ グ メ ン ト 外 の 仮 想 メ モ リ ー に ア ク セ ス し た 場 合 に も セ グ メ ン テ ー シ ョ ン 侵 害 が 発 生 す る 。

mremap() は Linux の ペ ー ジ テ ー ブ ル 方 式 を 使 用 す る 。 mremap() は 仮 想 ア ド レ ス と メ モ リ ー ペ ー ジ の マ ッ ピ ン グ を 変 更 す る 。 こ れ は 非 常 に 効 率 的 な realloc(3) を 実 装 す る の に 使 用 さ れ て い る 。

flags ビ ッ ト マ ス ク 引 数 は 0 ま た は 以 下 の フ ラ グ を 含 む :
MREMAP_MAYMOVE
デ フ ォ ル ト で は 、 現 在 の 位 置 に マ ッ ピ ン グ を 拡 張 す る た め の 十 分 な 空 き が な け れ ば mremap() は 失 敗 す る 。 こ の フ ラ グ が 指 定 さ れ る と 、 カ ー ネ ル は 必 要 が あ れ ば マ ッ ピ ン グ を 新 し い 仮 想 ア ド レ ス に 再 配 置 す る こ と が で き る マ ッ ピ ン グ が 再 配 置 さ れ る と 、 古 い マ ッ ピ ン グ 位 置 へ の 絶 対 ポ イ ン タ ー は 無 効 に な る (マ ッ ピ ン グ の 開 始 ア ド レ ス か ら の 相 対 オ フ セ ッ ト は 有 効 の ま ま で あ る )。
MREMAP_FIXED
(Linux 2.3.31 以 降 ) こ の フ ラ グ は mmap(2)MAP_FIXED フ ラ グ と 似 た よ う な 目 的 で 用 い ら れ る 。 こ の フ ラ グ が 指 定 さ れ る と 、 mremap() は 5 番 目 の 引 き 数 void *new_address を 受 け 取 り 、 こ の 引 数 は マ ッ ピ ン グ が 移 動 さ れ る べ き ア ド レ ス を 指 定 す る 。 こ の ア ド レ ス は ペ ー ジ 境 界 に 合 っ て い な け れ ば な ら な い 。 new_addressnew_size で 指 定 さ れ る ア ド レ ス 範 囲 に 過 去 の マ ッ ピ ン グ が あ っ た 場 合 、 そ の マ ッ ピ ン グ は ア ン マ ッ プ さ れ る (unmapped)。 MREMAP_FIXED を 指 定 し た 場 合 は 、 MREMAP_MAYMOVE も 指 定 し な け れ ば な ら な い 。

old_addressold_size で 指 定 さ れ る メ モ リ ー セ グ メ ン ト が (mlock(2) や 同 様 の も の で ) ロ ッ ク さ れ て い る 場 合 、 セ グ メ ン ト の サ イ ズ が 変 わ っ た り 再 配 置 さ れ た り し た 時 に ロ ッ ク も 維 持 さ れ る 。 そ の 結 果 、 プ ロ セ ス に よ っ て ロ ッ ク さ れ る メ モ リ ー の 量 は 変 化 す る 。

返 り 値

成 功 し た 場 合 は mremap() は 新 し い 仮 想 メ モ リ ー 領 域 へ の ポ イ ン タ ー を 返 す 。 エ ラ ー の 場 合 は MAP_FAILED (す な わ ち (void *) −1) が 返 さ れ 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

EAGAIN 呼 び 出 し 元 が ロ ッ ク さ れ て い る メ モ リ ー セ グ メ ン ト を 拡 張 し よ う と し た が 、

RLIMIT_MEMLOCK リ ソ ー ス 制 限 を 越 え ず に こ れ を 行 う こ と が で き な い 。

EFAULT 「 セ グ メ ン テ ー シ ョ ン 違 反

(segmentation fault)」 old_address か ら

old_address+old_size の 範 囲 の ア ド レ ス の ど れ か が こ の プ ロ セ ス に お い て 不 正 な 仮 想 メ モ リ ー ア ド レ ス で あ る 。 た と え 要 求 し た ア ド レ ス 空 間 全 体 を 含 む よ う な マ ッ ピ ン グ が あ っ た と し て も 、 そ れ ら の マ ッ ピ ン グ が 異 な っ た 型 な ら ば EFAULT を 受 け 取 る だ ろ う 。

EINVAL 不 正 な 引 き 数 が 与 え ら れ た 。 可 能 性 の あ る 原 因 は 以 下 の 通 り で あ る : た い て い は

old_address が ペ ー ジ 境 界 に 合 っ て な い ; flagsMREMAP_MAYMOVE ま た は MREMAP_FIXED 以 外 の 値 が 指 定 さ れ て い る ; new_size が ゼ ロ ; new_size ま た は new_address の 値 が 不 正 ; new_addressnew_size で 指 定 さ れ る 新 し い ア ド レ ス 範 囲 が old_addressold_size で 指 定 さ れ る 古 い ア ド レ ス 範 囲 と 重 な っ て い る ; MREMAP_FIXED が 指 定 さ れ て い る が MREMAP_MAYMOVE が 指 定 さ れ て い な い 。

ENOMEM 現 在 の 仮 想 ア ド レ ス で は メ モ リ ー 領 域 が 拡 張 で き ず 、

MREMAP_MAYMOVE

フ ラ グ が flags に 設 定 さ れ て い な い 。 ま た は 十 分 な (仮 想 ) メ モ リ ー が 存 在 し な い 。

準 拠

こ の コ ー ル は Linux 特 有 で あ り 、 移 植 を 意 図 し た プ ロ グ ラ ム で 使 用 す べ き で は な い 。

注 意

バ ー ジ ョ ン 2.4 よ り 前 の glibc で は 、 MREMAP_FIXED の 定 義 は 公 開 さ れ て お ら ず 、 mremap() の プ ロ ト タ イ プ は new_address 引 き 数 を 取 ら な か っ た 。

関 連 項 目

brk(2), getpagesize(2), getrlimit(2), mlock(2), mmap(2), sbrk(2), realloc(3), malloc(3) ペ ー ジ 分 割 さ れ た メ モ リ ー に つ い て も っ と 詳 し く 知 り た い な ら ば 、 あ な た の お 気 に 入 り の オ ペ レ ー テ ィ ン グ シ ス テ ム の 教 科 書 を 参 照 し て ほ し い (例 え ば 、 Modern Operating Systems by Andrew S. Tanenbaum, Inside Linux by Randolf Bentson, The Design of the UNIX Operating System by Maurice J. Bach.)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。