2017-02-15 1 views
3

mmap()は戻り値がシステム上の最大整列に揃うことを保証しますか?すなわち、mmapがalignof(std::max_align_t)の倍数であるポインタ値を返さなければならないことをPOSIX標準によって保証されていますか?mmapはポインタの値を整列して返します

私ははいそれがない(2)のマニュアルページまたはMAC OSX用のmmap(2)のmanページ

+0

私はそれが保証されているかどうかわかりませんが、ハードウェアの能力に支えられているので、そうしなければ非常に驚くでしょう。 –

+0

[このリンク](http://stackoverflow.com/questions/31411730/mmap-enforce-64k-alignment)が役立つ可能性があります。 Quoated:mmapによって返されたアドレスは、ページアライメントされていることが保証されています。 – felix

+0

@felix 'munmap()'のmanページは、 'addrパラメータがページ境界にない(つまり、ページサイズの倍数).'と言っています。つまり、ページ境界にないメモリを割り当て解除できません。ページ境界が最大の配置よりも大きいので、ポインタが最大の位置合わせで整列していない場合には 'munmap()'を呼び出すことができません – Curious

答えて

3

のいずれかのUbuntu Linuxのmmapの上でこの情報を見つけることができませんでした。最も「人気の」NULLマッピング

の場合

http://man7.org/linux/man-pages/man2/mmap.2.html

addrがNULLの場合、カーネルは へのマッピングを作成するアドレスを選択します。これは、新しく マッピングを作成する最も移植性の高い方法です。 addrがNULLでなければ、カーネルはマッピングをどこに置くかについてヒント とします。 Linuxのの場合、マップは付近のページ境界に作成された になります。新しいマッピングのアドレスは、呼び出しの結果として返される です。

あなたは

よりMAP_FIXEDを指定してもヒントとしてaddrの解釈しないでください:まさにその アドレスの場所のマッピングを。 addrは、ページサイズの倍数である必要があります。 addrとlenによって指定された領域 が既存の マッピングのページと重複する場合、既存のマッピングの重複部分は になります。指定したアドレスを使用できない場合、mmap()は に失敗します。マッピングのために固定アドレスを必要とするのは、 以下であるため、このオプションの使用はお勧めしません。実際に、最小のページを撮影

は4096B(x86用が、他のプラットフォームのためにそれはとにかく1024Bの倍数である)とstdようです:: max_align_tは、それがallignedされる64ビットシステム上で16Bである可能性が最も高いです。

関連する問題