2011-11-02 4 views
5

私はのmmap()いくつかのPRIVATEANONYMOUSページをしましたし、その後でそれらを拡張する場合はmremap ()、新しいスペースもゼロに初期化されますでしょうか?mremapは成長の際にメモリを "初期化"しますか?

Linuxソースでmremap(mm/mremap.c)のコードを読もうとしましたが、現在持っていないドメイン固有の知識が必要です(vma _ ### stuff)。さえ確認それは...

を見て適切な場所だ。しかし、私ははmremap()されたメモリがクリアされることを考える集まってきたものから、これは正しいでしょうか?

配分はこの

list = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 

のように行われ、その後、再マップは、この

newList = mremap(list, oldSize, newSize, MREMAP_MAYMOVE) 

ああのように行われ、最後に、それはだLinuxの具体的な質問、(最近のカーネルを実行しています> = 2.6.28)およびlibc(> = 2.11.1)

答えて

4

匿名ページは、ユニバーサルゼロページ。彼らはいつも(Linuxだけでなく、匿名のマッピングを提供するすべてのシステムで)常に存在しており、いつもそうです。 mremap(またはbrk)が匿名マッピングを拡張すると、新しい匿名(ゼロ)ページが取得されます。自分で初期化する必要はありません。

+0

はい。ゼロページ以外はセキュリティホールになります。 –

+0

ユニバーサルゼロページのコピーオンライトマッピングに間違いがあります。少なくともLinuxでは、これは 'mmap()'の仕組みではありません。マップされたメモリへの最初のアクセスでマッピングされた物理ページを取得します。これは、物理ページをゼロにしてマップするカーネルページフォルトハンドラです。普遍的なゼロページは含まれていません。 –

+1

本当ですか?確かに、読み取り専用匿名マッピングの場合、各ページの物理ページを作成しません。私が言ったことは、重複したページのマージを有効にすれば確実に真実ですが、一般的には間違っているかもしれません。私はRTFSしたりテストしたりしていません。 –

関連する問題