ファイル長より大きいアドレスを読み書きするときのファイルサポートメモリマッピングの動作は何ですか?

ファイル長より大きいアドレスを読み書きするときのファイルサポートメモリマッピングの動作は何ですか?

長さが非常に長いファイルのメモリマップを開くことが未定義の動作であることを確認したいと思います。マイユースケースは、システムコールwriteを介してファイルを追加するときですmremapmmapたとえば、大きすぎる場合、またはページの境界に揃っていない場合)"の場合はEINVALを返しますが、これは明らかに非常に不明です。よりはるかに大きいメモリマップを開き、ここに値を書き込んでからすぐにその値を読み取るプログラムを書くと、呼び出しがエラーを返さずに値mmapが実際に正しく書き込まれることがわかりました。問題がある値を破損したものとしてマークする以外に、何もしない小さなインラインアセンブリを使用して、このロードとストアを最適化しないようにしましたSIGBUS。 、私の知る限りではない。

これはmmap、この方法を使用すると、メモリマップを再生成せずにファイルの変更を追跡するユースケースで機能できることを意味しますが、これが意図的なものか偶発的なのかを疑問に思います。私はLinuxカーネルの保証されていない動作に頼りたくありません。特に、情報がディスクと正しく同期されておらず、後で重大なエラーが発生する可能性がある場合は、これがさらに重要です。この動作はどこかに定義または保証されていますか?

ベストアンサー1

答えは(隠されている)mmap(2) ページの NOTES 部分:

   A file is mapped in multiples of the page size.  For a  file  that
   is not a multiple of the page size, the remaining memory is zeroed
   when mapped, and writes to that region are not written out to  the
   file.

しかし、テキストはもう少し明確になり、ページの議論はSIGBUSまったく明確ではありません。私は持っています変更上記のテキストは次のようになります。

   A  file  is mapped in multiples of the page size.  For a file that
   is not a multiple of the page size, the  remaining  bytes  in  the
   partial page at the end of the mapping are zeroed when mapped, and
   modifications to that region are not written out to the file.

説明を次のように変更しましたSIGBUS

   SIGBUS Attempted  access  to a page of the buffer that lies beyond
          the end of the mapped file.   For  an  explanation  of  the
          treatment  of the bytes in the page that corresponds to the
          end of a mapped file that is not a  multiple  of  the  page
          size, see NOTES.

おすすめ記事