名 前
mmap, munmap − フ ァ イ ル や デ バ イ ス を メ モ リ ー に マ ッ プ /ア ン マ ッ プ す る
書 式
#include <sys/mman.h>
void
*mmap(void *addr, size_t length,
int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t
length); 機 能 検 査
マ ク ロ の 要 件
に 関 す る 情 報
は 「 注 意 」 の
節 を 参 照 。
説 明
mmap() は 、 新 し い マ ッ ピ ン グ を 呼 び 出 し 元 プ ロ セ ス の 仮 想 ア ド レ ス 空 間 に 作 成 す る 。 新 し い マ ッ ピ ン グ の 開 始 ア ド レ ス は addr で 指 定 さ れ る 。 マ ッ ピ ン グ の 長 さ は length 引 き 数 で 指 定 さ れ る 。
addr が NULL の 場 合 、 カ ー ネ ル が マ ッ ピ ン グ を 作 成 す る ア ド レ ス を 選 択 す る 。 こ の 方 法 は 最 も 移 植 性 の あ る 新 し い マ ッ ピ ン グ の 作 成 方 法 で あ る 。 addr が NULL で な い 場 合 、 カ ー ネ ル は マ ッ ピ ン グ を ど こ に 配 置 す る か の ヒ ン ト と し て addr を 使 用 す る 。 Linux で は 、 マ ッ ピ ン グ は す ぐ 近 く の ペ ー ジ 境 界 に 作 成 さ れ る 。 新 し い マ ッ ピ ン グ の ア ド レ ス は 、 呼 び 出 し の 返 り 値 と し て 返 さ れ る 。 フ ァ イ ル マ ッ ピ ン グ の 内 容 は 、 フ ァ イ ル デ ィ ス ク リ プ タ ー fd で 参 照 さ れ る フ ァ イ ル (も し く は 他 の オ ブ ジ ェ ク ト ) の オ フ セ ッ ト offset か ら 開 始 さ れ る length バ イ ト の デ ー タ で 初 期 化 さ れ る (フ ァ イ ル マ ッ ピ ン グ は 無 名 マ ッ ピ ン グ の 反 対 語 で あ る 。 MAP_ANONYMOUS を 参 照 )。 offset は sysconf(_SC_PAGE_SIZE) が 返 す ペ ー ジ サ イ ズ の 倍 数 で な け れ ば な ら な い 。 引 き 数 prot に は 、 マ ッ ピ ン グ の メ モ リ ー 保 護 を ど の よ う に 行 な う か を 指 定 す る (フ ァ イ ル の オ ー プ ン モ ー ド と 矛 盾 し て は い け な い )。 prot に は 、 PROT_NONE か 、 以 下 の フ ラ グ を ひ と つ 以 上 ビ ッ ト 毎 の 論 理 和 (OR) を と っ た も の を 指 定 で き る 。
PROT_EXEC ペ ー ジ は 実 行 可 能 で あ る 。 |
||
PROT_READ ペ ー ジ は 読 み 込 み 可 能 で あ る 。 |
||
PROT_WRITE ペ ー ジ に 書 き 込 み 可 能 で あ る 。 |
||
PROT_NONE ペ ー ジ に は ア ク セ ス で き な い 。 |
flags 引 き 数 に よ り 、 マ ッ ピ ン グ に 対 す る 更 新 が 同 じ 領 域 を マ ッ ピ ン グ し て い る 他 の プ ロ セ ス に 見 え る か 、 更 新 が マ ッ ピ ン グ 元 の フ ァ イ ル を 通 じ て 伝 え ら れ る か 、 が 決 定 さ れ る 。 こ の 動 作 は 、 以 下 の 値 の い ず れ か 一 つ だ け (複 数 は 指 定 で き な い ) を flags に 含 め る こ と で 指 定 す る 。
MAP_SHARED こ の マ ッ ピ ン グ を 共 有 す る 。 マ ッ ピ ン グ に 対 す る 更 新 は こ の フ ァ イ ル を マ ッ ピ ン グ し て い る 他 の プ ロ セ ス か ら 見 え る 。 更 新 は マ ッ ピ ン グ 元 の フ ァ イ ル を 通 じ て 伝 え ら れ る 。 た だ し 、 フ ァ イ ル の 実 際 の 更 新 は |
msync(2) ま
た は munmap() が 呼 ば
れ る ま で 行 わ
れ な い こ と も
あ る 。
MAP_PRIVATE プ ラ イ ベ ー
ト な copy−on−write (書
き 込 み 時 コ ピ
ー ) マ ッ プ を 生
成 す る 。 マ ッ
ピ ン グ に 対 す
る 更 新 は 同 じ
フ ァ イ ル を マ
ッ ピ ン グ し て
い る 他 の プ ロ
セ ス に は 見 え
ず 、 更 新 が マ
ッ ピ ン グ 元 の
フ ァ イ ル を 通
じ て 伝 え ら れ
る こ と も な い
。 mmap() の 呼 び 出
し 後 に マ ッ ピ
ン グ 元 の フ ァ
イ ル に 対 し て
行 わ れ た 変 更
が 、 マ ッ プ 領
域 に 反 映 さ れ
る か ど う か は
規 定 さ れ て い
な い 。 上 記 の
二 つ の フ ラ グ
は POSIX.1−2001 で 規 定
さ れ て い る 。
さ ら に 、 以 下
の 値 の う ち 0 個
以 上 を ビ ッ ト
毎 の 論 理 和 (OR) で
flags に 指 定 す る
こ と が で き る
。
MAP_32BIT (Linux 2.4.20, 2.6 以 降 )
マ ッ ピ ン グ を
プ ロ セ ス の ア
ド レ ス 空 間 の
先 頭 2 ギ ガ バ イ
ト 以 内 に 配 置
す る 。 こ の フ
ラ グ が サ ポ ー
ト さ れ て い る
の は x86−64 ア ー キ
テ ク チ ャ ー 上
の 64 ビ ッ ト プ ロ
グ ラ ム の み で
あ る 。 こ の フ
ラ グ が 追 加 さ
れ た の は 、 ス
レ ッ ド の ス タ
ッ ク を メ モ リ
ー の 先 頭 2GB 以 内
の ど こ か に 割
り 当 て る こ と
で 、 初 期 の い
く つ か の 64 ビ ッ
ト プ ロ セ ッ サ
に お け る コ ン
テ キ ス ト ス イ
ッ チ の 性 能 問
題 を 改 善 す る
た め で あ る 。
最 近 の x86−64 プ ロ
セ ッ サ で は こ
の 性 能 問 題 は
も は や 存 在 せ
ず 、 そ の よ う
な シ ス テ ム で
は こ の フ ラ グ
を 使 用 す る 必
要 は な い 。
MAP_FIXED が セ ッ ト
さ れ て い る 場
合 は 、 MAP_32BIT フ
ラ グ は 無 視 さ
れ る 。
MAP_ANON
MAP_ANONYMOUS の 同 義 語 。 非 推 奨 。
MAP_ANONYMOUS マ
ッ ピ ン グ は ど
の フ ァ イ ル と
も 関 連 付 け さ
れ な い 。 マ ッ
ピ ン グ の 内 容
は 0 で 初 期 化 さ
れ る 。 引 き 数
fd と offset は 無 視
さ れ る 。 た だ
し 、 実 装 に よ
っ て は MAP_ANONYMOUS (も
し く は MAP_ANON) が
指 定 さ れ た 場
合 、 fd を −1 に
す る 必 要 が あ
り 、 移 植 性 が
必 要 な ア プ リ
ケ ー シ ョ ン で
は 必 ず fd を −1
に す べ き で あ
る 。 MAP_ANONYMOUS と
MAP_SHARED を 組 み 合
わ せ て の 利 用
は カ ー ネ ル 2.4 以
降 の Linux で の み サ
ポ ー ト さ れ て
い る 。
MAP_DENYWRITE こ の フ ラ
グ は 無 視 さ れ
る (ず っ と 前 は
、 マ ッ プ 元 の
フ ァ イ ル へ の
書 き 込 み を 行
お う と す る と
、 エ ラ ー ETXTBUSY で
失 敗 す る よ う
に シ グ ナ ル が
設 定 さ れ て い
た が 、 こ れ は
denial−of−service (サ ー ビ
ス 拒 否 ) 攻 撃 の
原 因 と な っ た
)。
MAP_EXECUTABLE こ の フ ラ
グ は 無 視 さ れ
る 。
MAP_FILE 互 換 性 の た
め の フ ラ グ 。
無 視 さ れ る 。
MAP_FIXED
addr を ア ド レ ス の ヒ ン ト と し て 使 用 す る の で は な く 、 addr で 指 定 さ れ た ア ド レ ス を そ の ま ま 使 用 し て マ ッ ピ ン グ を 配 置 す る 。 addr は ペ ー ジ サ イ ズ の 倍 数 で な け れ ば な ら な い 。 addr と len で 指 定 さ れ た メ モ リ ー 領 域 が 既 存 の マ ッ ピ ン グ の ペ ー ジ と 重 な る 場 合 、 既 存 の マ ッ ピ ン グ の 重 な っ た 部 分 は 捨 て ら れ る 。 も し 指 定 さ れ た ア ド レ ス が 使 用 で き な い 場 合 、 mmap() は 失 敗 す る 。 マ ッ ピ ン グ に 対 し て 固 定 ア ド レ ス を 要 求 す る の は 移 植 性 の 面 で 劣 る の で 、 こ の オ プ シ ョ ン は 使 用 し な い こ と を 推 奨 す る 。
MAP_GROWSDOWN ス
タ ッ ク 用 に 使
用 さ れ る 。 マ
ッ ピ ン グ を メ
モ リ ー 内 で 逆
向 き に 行 う こ
と を カ ー ネ ル
仮 想 メ モ リ ー
シ ス テ ム に 指
示 す る 。 (訳 注
: マ ッ ピ ン グ
は 通 常 は メ モ
リ ー ア ド レ ス
が 増 加 す る 向
き に 行 う が 、
こ の オ プ シ ョ
ン を 指 定 す る
と 逆 向 き に マ
ッ ピ ン グ を 行
う )
MAP_HUGETLB (Linux 2.6.32 以 降 )
"huge page" を 使 っ て マ ッ ピ ン グ を 割 り 当 て る 。 詳 し い 情 報 は 、 Linux カ ー ネ ル ソ ー ス の Documentation/vm/hugetlbpage.txt を 参 照 。
MAP_LOCKED (Linux 2.5.37
以 降 ) マ ッ プ さ
れ た 領 域 の ペ
ー ジ を mlock(2) の 方
法 で メ モ リ ー
内 に ロ ッ ク す
る 。 そ れ 以 前
の カ ー ネ ル で
は 、 こ の フ ラ
グ は 無 視 さ れ
る 。
MAP_NONBLOCK (Linux 2.5.46 以 降 )
MAP_POPULATE と 組 み 合 わ せ た 場 合 の み 意 味 を 持 つ 。 read−ahead (前 も っ て 読 み 込 む こ と ) を 実 行 し な い 。 単 に 、 す で に RAM 上 に 存 在 す る ペ ー ジ に 対 し て の み ペ ー ジ テ ー ブ ル エ ン ト リ ー を 作 成 す る 。 Linux 2.6.23 以 降 で は 、 こ の フ ラ グ は MAP_POPULATE に 何 の 影 響 も 与 え な い 。 い つ か MAP_POPULATE と MAP_NONBLOCK を 組 み 合 わ せ た 場 合 の 動 作 は 実 装 し 直 さ れ る か も し れ な い 。
MAP_NORESERVE こ
の マ ッ ピ ン グ
に 対 す る ス ワ
ッ プ 空 間 の 予
約 を 行 わ な い
。 ス ワ ッ プ 空
間 を 予 約 し た
場 合 は 、 こ の
マ ッ ピ ン グ の
変 更 が 必 ず 可
能 な こ と が 保
証 さ れ る 。 予
約 を 行 わ な か
っ た 場 合 、 物
理 メ モ リ ー に
空 き が な い と
書 き 込 み 時 に
SIGSEGV エ ラ ー を 受
け 取 る こ と が
あ る 。 proc(5) の
/proc/sys/vm/overcommit_memory フ ァ
イ ル に つ い て
の 議 論 も 参 照
。 バ ー ジ ョ ン 2.6
よ り 前 の カ ー
ネ ル で は 、 こ
の フ ラ グ は 書
き 込 み 可 能 な
プ ラ イ ベ ー ト
マ ッ ピ ン グ に
つ い て の み 効
果 が あ っ た 。
MAP_POPULATE (Linux 2.5.46 以 降 ) マ
ッ ピ ン グ 用 の
ペ ー ジ テ ー ブ
ル を 配 置 (populate) す
る フ ァ イ ル マ
ッ ピ ン グ の 場
合 に は 、 こ れ
に よ り フ ァ イ
ル が 先 読 み
(read−ahead) が 行 わ れ
る 。 こ の 以 後
は 、 マ ッ ピ ン
グ に 対 す る ア
ク セ ス が ペ ー
ジ フ ォ ー ル ト
で ブ ロ ッ ク さ
れ る こ と が な
く な る 。 Linux 2.6.23 以
降 で の み プ ラ
イ ベ ー ト マ ッ
ピ ン グ に つ い
て MAP_POPULATE が サ ポ
ー ト さ れ て い
る 。
MAP_STACK (Linux 2.6.27 以 降 ) プ
ロ セ ス や ス レ
ッ ド の ス タ ッ
ク に 適 し た ア
ド レ ス に マ ッ
ピ ン グ を 割 り
当 て る 。 現 在
の と こ ろ 、 こ
の フ ラ グ は 何
も し な い が 、 glibc
の ス レ ッ ド 実
装 で は 使 用 さ
れ て い る 。 こ
れ は 、 い く つ
か の ア ー キ テ
ク チ ャ ー で は
ス タ ッ ク の 割
り 当 て に 関 し
て 特 別 な 扱 い
が 必 要 な 場 合
に 、 glibc に そ の サ
ポ ー ト を 後 で
透 過 的 に 実 装
で き る よ う に
す る た め で あ
る 。
MAP_UNINITIALIZED (Linux 2.6.33 以 降 )
無 名 ペ ー ジ (anonymous
page) の ク リ ア を 行
わ な い 。 こ の
フ ラ グ は 組 み
込 み デ バ イ ス
で の 性 能 向 上
を 目 的 に 作 ら
れ て も の で あ
る 。 カ ー ネ ル
の 設 定 で
CONFIG_MMAP_ALLOW_UNINITIALIZED オ プ
シ ョ ン が 有 効
に な っ て い る
場 合 の み 、 こ
の フ ラ グ は 効
果 を 持 つ 。 セ
キ ュ リ テ ィ 面
の 考 慮 か ら 、
こ の オ プ シ ョ
ン は 通 常 組 み
込 み デ バ イ ス
(す な わ ち 、 ユ
ー ザ ー メ モ リ
ー の 内 容 を 完
全 に 制 御 化 に
お け る デ バ イ
ス ) に お い て の
み 有 効 に さ れ
る 。 上 記 の フ
ラ グ の 中 で は
、 MAP_FIXED だ け が
POSIX.1−2001 で 規 定 さ
れ て い る 。 し
か し な が ら 、
ほ と ん ど の シ
ス テ ム で MAP_ANONYMOUS
(ま た は そ の 同
義 語 で あ る
MAP_ANON) も サ ポ ー
ト さ れ て い る
。 い く つ か の
シ ス テ ム で は
、 上 記 以 外 に
フ ラ グ と し て
MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY,
MAP_LOCAL が 規 定 さ
れ て い る 。
mmap() に よ っ て マ ッ プ さ れ た メ モ リ ー の 属 性 は fork(2) の 際 に 継 承 さ れ る 。 フ ァ イ ル は ペ ー ジ サ イ ズ の 整 数 倍 の 領 域 に マ ッ プ さ れ る 。 サ イ ズ が ペ ー ジ サ イ ズ の 整 数 倍 で な い フ ァ イ ル の 場 合 、 マ ッ プ 時 に 残 り の 領 域 は 0 で 埋 め ら れ 、 こ の 領 域 へ 書 き こ み を 行 っ て も フ ァ イ ル に 書 き 出 さ れ る こ と は な い 。 マ ッ ピ ン グ を 行 っ た 元 フ ァ イ ル の サ イ ズ を 変 更 し た 場 合 、 元 フ ァ イ ル の 追 加 さ れ た り 削 除 さ れ た 領 域 に 対 応 す る マ ッ プ さ れ た ペ ー ジ に 対 し て ど の よ う な 影 響 が あ る か は 規 定 さ れ て い な い 。
munmap() シ ス テ ム コ ー ル munmap() は 指 定 さ れ た ア ド レ ス 範 囲 の マ ッ プ を 消 去 し 、 こ れ 以 降 の そ の 範 囲 内 へ の メ モ リ ー 参 照 は 不 正 と な る 。 こ の 領 域 は 、 プ ロ セ ス が 終 了 し た と き に も 自 動 的 に ア ン マ ッ プ さ れ る 。 一 方 、 フ ァ イ ル デ ィ ス ク リ プ タ ー を ク ロ ー ズ し て も 、 こ の 領 域 は ア ン マ ッ プ さ れ な い 。
addr ア ド レ ス は ペ ー ジ サ イ ズ の 整 数 倍 で な け れ ば な ら な い 。 指 定 さ れ た 範 囲 の 一 部 分 を 含 む 全 て の ペ ー ジ は ア ン マ ッ プ さ れ 、 こ れ 以 降 に こ れ ら の ペ ー ジ へ の 参 照 が あ る と SIGSEGV が 発 生 す る 。 指 定 し た 範 囲 内 に マ ッ プ さ れ た ペ ー ジ が 一 つ も 含 ま れ て い な い 場 合 で も エ ラ ー に な ら な い 。 フ ァ イ ル と 関 連 付 け ら れ た マ ッ ピ ン グ に 対 す る タ イ ム ス タ ン プ の 更 新 フ ァ イ ル と 関 連 付 け ら れ た マ ッ ピ ン グ の 場 合 、 マ ッ ピ ン グ さ れ た フ ァ イ ル の st_atime フ ィ ー ル ド は 、 mmap() さ れ て か ら ア ン マ ッ プ (unmap) さ れ る ま で の 間 に 更 新 さ れ る こ と が あ る 。 そ れ ま で に 更 新 が 行 わ れ て い な け れ ば 、 マ ッ プ さ れ た ペ ー ジ へ の 最 初 の 参 照 が あ っ た 際 に 更 新 さ れ る 。
PROT_WRITE と MAP_SHARED の 両 方 を 指 定 し て マ ッ プ さ れ た フ ァ イ ル の 場 合 、 書 き 込 み が あ る と 、 st_ctime と st_mtime の 両 フ ィ ー ル ド は 、 マ ッ プ さ れ た 領 域 へ の 書 き 込 み よ り 後 で 、 MS_SYNC ま た は MS_ASYNC フ ラ グ を 指 定 し て msync(2) が 呼 ば れ る 前 ま で に 更 新 さ れ る 。
返 り 値
mmap() は 成 功 す る と マ ッ プ さ れ た 領 域 へ の ポ イ ン タ ー を 返 す 。 失 敗 す る と 値 MAP_FAILED (つ ま り (void *) −1) を 返 し 、 errno が エ ラ ー の 内 容 に し た が っ て セ ッ ト さ れ る 。 munmap() は 成 功 す る と 0 を 返 す 。 失 敗 す る と −1 を 返 し 、 errno が セ ッ ト さ れ る (多 く の 場 合 EINVAL に な る だ ろ う )。
エ ラ ー
EACCES 以 下 の い ず れ か の 場 合 。 フ ァ イ ル デ ィ ス ク リ プ タ ー の 参 照 先 が 通 常 の フ ァ イ ル で は な い |
(non−regular file) 。 フ ァ イ ル マ ッ ピ ン グ を 要 求 し た が fd は 読 み 込 み 用 に オ ー プ ン さ れ て い な い 。 MAP_SHARED を 要 求 し て PROT_WRITE を セ ッ ト し た が fd は 読 み 書 き モ ー ド (O_RDWR) で オ ー プ ン さ れ て い な い 、 PROT_WRITE を セ ッ ト し た が 、 フ ァ イ ル は 追 加 (append) 専 用 で あ る 。
EAGAIN フ ァ イ ル が ロ ッ ク さ れ て い る 。 ま た は ロ ッ ク さ れ て い る メ モ リ ー が 多 す ぎ る |
(setrlimit(2) を 参 照 )。
EBADF |
fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー (file descriptor) で は な い (か つ MAP_ANONYMOUS が セ ッ ト さ れ て い な い )。 | ||
EINVAL |
addr か length か offset が 適 切 で な い (例 え ば 、 大 き す ぎ る と か 、 ペ ー ジ 境 界 に ア ラ イ ン メ ン ト さ れ て い な い )。 | ||
EINVAL |
(Linux 2.6.12 以 降 ) length が 0 で あ っ た 。 | ||
EINVAL |
flags に MAP_PRIVATE と MAP_SHARED の ど ち ら も 含 ま れ て い な か っ た 、 も し く は そ の 両 方 が 含 ま れ て い た 。 | ||
ENFILE |
シ ス テ ム 全 体 で オ ー プ ン さ れ て い る フ ァ イ ル の 総 数 が 上 限 に 達 し た 。
ENODEV 指 定 さ れ た フ ァ イ ル が 置 か れ て い る フ ァ イ ル シ ス テ ム が メ モ リ ー マ ッ ピ ン グ を サ ポ ー ト し て い な い 。 | |
ENOMEM メ モ リ ー に 空 き が な い 、 ま た は 処 理 中 の プ ロ セ ス の マ ッ ピ ン グ 数 が 最 大 数 を 超 過 し た 。 | |
EPERM |
prot 引 き 数 は PROT_EXEC を 行 う よ う に 指 定 さ れ て い る が 、 no−exec で マ ウ ン ト さ れ た フ ァ イ ル シ ス テ ム 上 の フ ァ イ ル に マ ッ プ 領 域 が 対 応 し て い る 。
EPERM 操 作 が |
file seal に よ り 禁 止 さ れ て い る 。 fcntl(2) 参 照 。 |
ETXTBSY
MAP_DENYWRITE が セ ッ ト さ れ て い る が fd で 指 定 さ れ て い る オ ブ ジ ェ ク ト は 書 き 込 み 用 に 開 か れ て い る 。
EOVERFLOW
32 ビ ッ ト ア ー キ テ ク チ ャ ー で large file 拡 張 を 使 っ て い る 場 合 (つ ま り 64 ビ ッ ト の off_t を 使 う 場 合 )、 length で 使 う ペ ー ジ 数 と offset で 使 う ペ ー ジ 数 を 足 し た 値 は unsigned long (32 ビ ッ ト ) を 超 え て し ま う (オ ー バ ー フ ロ ー し て し ま う ) 場 合 が あ る 。 マ ッ プ 領 域 を 利 用 す る 際 に 、 以 下 の シ グ ナ ル が 発 生 す る こ と が あ る :
SIGSEGV 読 み 込 み 専 用 で mmap さ れ た 領 域 へ 書 き 込 み を 行 お う と し た 。
SIGBUS バ ッ フ ァ ー の う ち 、 フ ァ イ ル に 関 連 づ け ら れ て い な い 部 分 |
(例 え ば フ ァ |
イ ル 末 尾 を 越 え た 部 分 な ど 。 こ れ に は 他 の プ ロ セ ス が フ ァ イ ル を 切 り 詰 め た 場 合 な ど も 含 ま れ る ) に ア ク セ ス し よ う と し た 。
準 拠
SVr4, 4.4BSD, POSIX.1−2001.
可 用 性
mmap(), msync(2) munmap() が 利 用 可 能 な POSIX シ ス テ ム で は 、 _POSIX_MAPPED_FILES は <unistd.h> で 0 よ り 大 き な 値 に 定 義 さ れ る (sysconf(3) も 参 照 の こ と )。
注 意
(i386 な ど の ) い く つ か の ア ー キ テ ク チ ャ ー で は 、 PROT_WRITE を セ ッ ト す る と 、 暗 黙 の う ち に PROT_READ が セ ッ ト さ れ る 。 PROT_READ を セ ッ ト し た 際 に 暗 黙 の う ち に PROT_EXEC が セ ッ ト さ れ る か ど う か は 、 ア ー キ テ ク チ ャ ー 依 存 で あ る 。 移 植 性 を 考 慮 し た プ ロ グ ラ ム で は 、 新 規 に マ ッ プ し た 領 域 で コ ー ド を 実 行 し た い 場 合 は 、 常 に PROT_EXEC を セ ッ ト す べ き で あ る 。 マ ッ ピ ン グ を 作 成 す る 移 植 性 の あ る 方 法 は 、 addr に 0 (NULL) を 指 定 し 、 flags か ら MAP_FIXED を 外 す こ と で あ る 。 こ の 場 合 、 シ ス テ ム が マ ッ ピ ン グ 用 の ア ド レ ス の 選 択 を 行 う 。 ア ド レ ス は 既 存 の マ ッ ピ ン グ と 衝 突 し な い よ う に 、 か つ 0 に な ら な い よ う に 選 択 さ れ る 。 MAP_FIXED フ ラ グ が 指 定 さ れ 、 か つ addr が 0 (NULL) の 場 合 に は 、 マ ッ プ さ れ る ア ド レ ス が 0 (NULL) に な る 。 特 定 の flags 定 数 は _BSD_SOURCE か _SVID_SOURCE の い ず れ か が 定 義 さ れ た 場 合 に の み 定 義 さ れ る 。 (_GNU_SOURCE も 定 義 さ れ て い る 必 要 が あ る 。 こ れ ら の フ ラ グ は す べ て Linux 固 有 の も の な の で 、 特 に _GNU_SOURCE を 必 要 と す る 点 は も っ と 論 理 的 に 決 め ら れ る べ き で あ っ た 。 ) 関 係 す る フ ラ グ は MAP_32BIT, MAP_ANONYMOUS (と そ の 同 義 語 の MAP_ANON), MAP_DENYWRITE, MAP_EXECUTABLE, MAP_FILE, MAP_GROWSDOWN, MAP_HUGETLB, MAP_LOCKED, MAP_NONBLOCK, MAP_NORESERVE, MAP_POPULATE, MAP_STACK で あ る 。
C ラ イ ブ ラ リ と カ ー ネ ル ABI の 違 い こ の ペ ー ジ で は glibc の mmap() の ラ ッ パ ー 関 数 が 提 供 す る イ ン タ ー フ ェ ー ス に つ い て 説 明 し て い る 。 元 々 は 、 こ の 関 数 は 同 じ 名 前 の シ ス テ ム コ ー ル を 起 動 し て い た 。 カ ー ネ ル 2.4 以 降 、 こ の シ ス テ ム コ ー ル は mmap2(2) に 取 っ て 代 わ ら れ 、 現 在 で は 、 glibc の mmap() の ラ ッ パ ー 関 数 は offset を 適 切 に 調 整 し て か ら mmap2(2) を 起 動 す る 。
バ グ
Linux に お い て は 、 上 記 の MAP_NORESERVE で 述 べ ら れ て い る よ う な 保 証 は な い 。 デ フ ォ ル ト で は 、 シ ス テ ム が メ モ リ ー を 使 い 切 っ た 場 合 に は 、 ど の プ ロ セ ス が い つ 強 制 終 了 さ れ る か 分 か ら な い か ら で あ る 。
2.6.7 よ り 前 の カ ー ネ ル で は 、 prot に PROT_NONE が 指 定 さ れ た 場 合 に の み 、 MAP_POPULATE フ ラ グ が 効 力 を 持 つ 。
SUSv3 で は 、 length が 0 の 場 合 、 mmap() は 失 敗 す る と 規 定 さ れ て い る 。 し か し な が ら 、 2.6.12 よ り 前 の カ ー ネ ル で は 、 こ の 場 合 に mmap() は 成 功 し て い た (マ ッ ピ ン グ は 作 成 さ れ ず 、 addr が 返 さ れ て い た )。 カ ー ネ ル 2.6.12 以 降 で は 、 mmap() は エ ラ ー EINVAL で 失 敗 す る 。
POSIX で は 、 シ ス テ ム は オ ブ ジ ェ ク ト 末 尾 の 部 分 ペ ー ジ を 常 に 0 で 埋 め 、 末 尾 よ り 後 ろ の オ ブ ジ ェ ク ト を 決 し て 変 更 し て は な ら な い 、 と 規 定 し て い る 。 Linux で は 、 オ ブ ジ ェ ク ト 末 尾 よ り 後 ろ の 部 分 ペ ー ジ に デ ー タ を 書 き 込 ん だ 場 合 、 そ の フ ァ イ ル を ク ロ ー ズ し て ア ン マ ッ プ し た 後 で あ っ て も ペ ー ジ キ ャ ッ シ ュ に デ ー タ が 残 り 続 け 、 デ ー タ が フ ァ イ ル 自 体 に 書 き 込 ま れ て い な く て も 、 そ れ 以 降 の マ ッ ピ ン グ で 変 更 さ れ た 内 容 が 見 え る 可 能 性 が あ る 。 い く つ か の 場 合 で は 、 ア ン マ ッ プ を 行 う 前 に msync(2) を 呼 び 出 す こ と で 、 こ の 状 況 を 修 正 す る こ と が で き る 。 し か し 、 こ れ は tmpfs で は 機 能 し な い (例 え ば 、 shm_overview(7) で 説 明 さ れ て い る POSIX 共 有 メ モ リ ー イ ン タ ー フ ェ ー ス を 使 っ た 場 合 )。
例
以 下 の プ ロ グ ラ ム は 、 一 番 目 の コ マ ン ド ラ イ ン 引 き 数 で 指 定 さ れ た フ ァ イ ル の 一 部 を 標 準 出 力 に 表 示 す る 。 表 示 す る 範 囲 は 、 二 番 目 、 三 番 目 の コ マ ン ド ラ イ ン 引 き 数 で 渡 さ れ る オ フ セ ッ ト と 長 さ で 指 定 さ れ る 。 こ の プ ロ グ ラ ム は 、 指 定 さ れ た フ ァ イ ル の 必 要 な ペ ー ジ の メ モ リ ー マ ッ ピ ン グ を 作 成 し 、 write(2) を 使 っ て 所 望 の バ イ ト を 出 力 す る 。 プ ロ グ ラ ム の ソ ー ス
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define
handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{
char *addr;
int fd;
struct stat sb;
off_t offset, pa_offset;
size_t length;
ssize_t s;
if (argc < 3
|| argc > 4) {
fprintf(stderr, "%s file offset [length]\n",
argv[0]);
exit(EXIT_FAILURE); }
fd =
open(argv[1], O_RDONLY);
if (fd == −1)
handle_error("open");
if (fstat(fd,
&sb) == −1) /* To obtain file size */
handle_error("fstat");
offset =
atoi(argv[2]);
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) −
1);
/* offset for mmap() must be page aligned */
if (offset
>= sb.st_size) {
fprintf(stderr, "offset is past end of file\n");
exit(EXIT_FAILURE); }
if (argc == 4)
{
length = atoi(argv[3]);
if (offset + length > sb.st_size)
length = sb.st_size − offset;
/* Can't display bytes past end of file */ }
else { /* No length arg ==> display to end of file */
length = sb.st_size − offset; }
addr =
mmap(NULL, length + offset − pa_offset, PROT_READ,
MAP_PRIVATE, fd, pa_offset);
if (addr == MAP_FAILED)
handle_error("mmap");
s =
write(STDOUT_FILENO, addr + offset − pa_offset,
length);
if (s != length) {
if (s == −1)
handle_error("write");
fprintf(stderr,
"partial write");
exit(EXIT_FAILURE); }
exit(EXIT_SUCCESS); }
関 連 項 目
getpagesize(2), memfd_create(2), mincore(2), mlock(2), mmap2(2), mprotect(2), mremap(2), msync(2), remap_file_pages(2), setrlimit(2), shmat(2), shm_open(3), shm_overview(7)
proc(5) の /proc/[pid]/maps, /proc/[pid]/map_files, /proc/[pid]/smaps の 説 明 。
B.O. Gallmeister, POSIX.4, O’Reilly, pp. 128−129 and 389−391.
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。