私は混乱していmmap
ます.(指定されたサイズに関係なく)メモリのページ全体を割り当てますか,それともあなたが要求したサイズを割り当てるだけですか? 本当に、後続の呼び出しで何が起こるかについて興味がmmap
あります.2番目の呼び出しは新しいページを割り当てますか(両方の呼び出しがページサイズ未満の量を使用する場合でも)、または前の呼び出しに隣接するブロックを割り当てますか?
同じことmprotect
- それはページ全体を保護しますか、それとも指定された部分だけを保護しますか?
しかし、それはmmap
それ自体が原因ではなく、カーネルが実際には何もできないためです。メモリはページ単位で編成されており、MMU はページ単位で「考える」ため、ページの半分を割り当てて残りの半分を他の人に渡す方法はありません (どちらにしても正気で合理的な方法ではありません)。
たとえば、プロセス 2 がそれぞれ半分のページを割り当てている場合、プロセス 1 から機密データを盗むのを防ぐにはどうすればよいでしょうか? メモリ保護システムはそのようには機能しません。それを防ぐことは不可能です。
mmap
長さがゼロ以外であることを義務付けます。そうしないと失敗します。それ以外には、(矛盾するフラグを除いて) 入力パラメーターに関する要件はありませんが、もちろん、実装は、その裁量で、他の理由で呼び出しが失敗することを常に許可されています (ここでの「実装」は、たとえば「Linux」を意味します)。 )。
マッピングの実効アドレス ( への呼び出しが成功すると返されるmmap
) は、アドレス ヒントの実装定義関数です。実際には、これはヒントを前のページ (通常は 4096 バイト) の境界まで切り捨て、長さを次のページの境界まで切り上げることを意味します。
Linux のバージョンが異なると、一部のアドレス範囲で動作が異なります。たとえば、バージョン 2.6 より前では、以下のヒントmmap_min_addr
は失敗しますがEINVAL
、現在はアドレスが切り上げられるため有効です。
出典:POSIX