Manpages

名 前

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 を 参 照 )。 offsetsysconf(_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 で 初 期 化 さ れ る 。 引 き 数 fdoffset は 無 視 さ れ る 。 た だ し 、 実 装 に よ っ て は MAP_ANONYMOUS (も し く は MAP_ANON) が 指 定 さ れ た 場 合 、 fd を −1 に す る 必 要 が あ り 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 必 ず fd を −1 に す べ き で あ る 。 MAP_ANONYMOUSMAP_SHARED を 組 み 合 わ せ て の 利 用 は カ ー ネ ル 2.4 以 降 の Linux で の み サ ポ ー ト さ れ て い る 。
MAP_DENYWRITE
こ の フ ラ グ は 無 視 さ れ る (ず っ と 前 は 、 マ ッ プ 元 の フ ァ イ ル へ の 書 き 込 み を 行 お う と す る と 、 エ ラ ー ETXTBUSY で 失 敗 す る よ う に シ グ ナ ル が 設 定 さ れ て い た が 、 こ れ は denial−of−service (サ ー ビ ス 拒 否 ) 攻 撃 の 原 因 と な っ た )。
MAP_EXECUTABLE
こ の フ ラ グ は 無 視 さ れ る 。
MAP_FILE
互 換 性 の た め の フ ラ グ 。 無 視 さ れ る 。
MAP_FIXED

addr を ア ド レ ス の ヒ ン ト と し て 使 用 す る の で は な く 、 addr で 指 定 さ れ た ア ド レ ス を そ の ま ま 使 用 し て マ ッ ピ ン グ を 配 置 す る 。 addr は ペ ー ジ サ イ ズ の 倍 数 で な け れ ば な ら な い 。 addrlen で 指 定 さ れ た メ モ リ ー 領 域 が 既 存 の マ ッ ピ ン グ の ペ ー ジ と 重 な る 場 合 、 既 存 の マ ッ ピ ン グ の 重 な っ た 部 分 は 捨 て ら れ る 。 も し 指 定 さ れ た ア ド レ ス が 使 用 で き な い 場 合 、 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_POPULATEMAP_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_WRITEMAP_SHARED の 両 方 を 指 定 し て マ ッ プ さ れ た フ ァ イ ル の 場 合 、 書 き 込 み が あ る と 、 st_ctimest_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

addrlengthoffset が 適 切 で な い (例 え ば 、 大 き す ぎ る と か 、 ペ ー ジ 境 界 に ア ラ イ ン メ ン ト さ れ て い な い )。

EINVAL

(Linux 2.6.12 以 降 ) length が 0 で あ っ た 。

EINVAL

flagsMAP_PRIVATEMAP_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 よ り 前 の カ ー ネ ル で は 、 protPROT_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/ に 書 か れ て い る 。

COMMENTS