C言語

【C言語】mmap関数の使い方、間違ってませんか?

2020年10月21日

関数仕様

書式

 

引数

addr マップ/マップ解除するメモリの先頭アドレス
len マップ/マップ解除するメモリの長さ(バイト単位)
prot アクセス保護の指定 (ビットフラグ)
flags フラグを指定
fd マップするファイル・デバイスのファイルディスクリプタ
offset マップするファイルの先頭からのオフセット

 

設定可能なPROT「アクセス保護」の種類

PROT_READ メモリは読み出し可能
PROT_WRITE メモリは書き込み可能
PROT_EXEC メモリは実行可能
PROT_NONE メモリは全てのアクセスが不可能

 

設定可能なFLAGの種類

MAP_PRIVATE メモリに書き込んでも、ファイルには書き込まれない
MAP_SHARED ファイルをマップしていれば、メモリに書き込むとファイルにも書き込まれる

 

戻り値

mmap

アドレス値 マップされたメモリの先頭アドレス
MAP_FAILED エラーが発生 ((void *)-1)

 

munmap

0 メモリのマップ解除に成功
-1 エラーが発生

 

機能

  • 新しいメモリマッピングを、呼び出し元プロセスの仮想アドレス空間に作成
  • 新しいマッピングの開始アドレスを addr で指定可能
  • ファイルマッピングの内容は、ファイルディスクリプタ fd で参照され、ファイルのオフセット offset から開始される len バイトのデータで初期化可能
  • offsetsysconf(_SC_PAGE_SIZE) が返すページサイズの倍数を指定可能
  • 引数 prot で、マッピングのメモリ保護をどのように行なうかを指定可能

 

引数による挙動の違い

addr

  • addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する
  • addr が NULL でない場合、カーネルはマッピングをどこに配置するかのヒントとして addr を使用する

注意ポイント

addr で指定したアドレスに必ずマッピングされるとは限らない。

 

fd

  • fd が -1 の場合、ファイル・デバイスのマッピングではないと判断される
  • fd が 0より大きく、そのプロセスで使用可能な値の場合、fd の指す内容がマッピングされる

 

注意すること

ここに注意

mmap() のエラー時、戻り値は MAP_FAILED (-1) である。NULL ではない

SANACHAN
SANACHAN
もし、戻り値を NULL と比較している場合は、直ちにコードを修正しよう!

 

サンプル:ゼロで初期化されたメモリをマッピング

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-,