2011-11-02 11 views
5

Ben mmap() bazı ÖZEL ve ANONİM sayfaları ettik ve sonra onları uzatırsanız mremap(), yeni alanı da sıfıra başlatıldı olsun mu?Mremap bellek büyümeye "başlatıyor" mu?

ben linux kaynağında mremap kodunu (aa/mremap.c) okuma denedim ama şu anda yok (VMA _ ### şeyler) sahip bazı alana özgü bilgi gerektirir. Anlamıştım kadarıyla ben mremap() ed bellek temizlenmiş olması düşünüyorum bile emin değil ki bu doğru,

... bakmak için doğru yer Ama?

Tahsisi bu

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

gibi yapılır ve sonra remap bu

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

Ah gibi yapılır ve son, bu kadar bir Linux spesifik bir soru, (son çekirdek çalışan > = 2.6.28) ve libc (> = 2.11.1)

cevap

4

Anonim sayfalar, evrensel evrensel sayfa. Her zaman (her sistemde, sadece Linux'ta değil, anonim eşleştirmeler sunuyor) ve her zaman olacaklar. mremap (veya brk) anonim bir eşlemeyi genişletdiğinde, yeni anonim (sıfır) sayfalar alırsınız. Onları kendiniz başlatmaya gerek yoktur.

+0

Yep. Sıfır sayfalardan başka bir şey de bir güvenlik açığı olacaktır. –

+0

Evrensel sıfır sayfanın yazma üzerine yazılan eşlemeleri hakkında yanılıyorsunuz. En azından Linux'ta bu, mmap() 'ın çalışması değildir. Eşlenmiş belleğe ilk erişimde eşlenmiş fiziksel sayfalar alırsınız ve bu, fiziksel sayfayı sıfırlayan ve haritalayan çekirdek sayfa hata işleyicisidir. Evrensel sıfır sayfa içermiyor. –

+1

Emin misin? Kesinlikle salt okunur anonim eşlemeler için her sayfa için fiziksel bir sayfa yapmaz. Yinelenen sayfaların birleştirilmesini sağlarsanız, bir anlamda kesinlikle söylediğim doğrudur, fakat genel olarak yanlış olabilirim; RTFS ya da test etmedim. –

İlgili konular