長さが非常に長いファイルのメモリマップを開くことが未定義の動作であることを確認したいと思います。マイユースケースは、システムコールwrite
を介してファイルを追加するときですmremap
。mmap
たとえば、大きすぎる場合、またはページの境界に揃っていない場合)"の場合は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.