2011-11-02 8 views
5

Se ho mmap() alcuni PRIVATA e ANONIME pagine e poi li estendo con mremap(), fa il nuovo spazio anche ottenere inizializzato a zero?mremap "inizializza" la memoria in fase di crescita?

ho provato a leggere il codice per mremap (mm/mremap.c) nei sorgenti di Linux, ma richiede una certa conoscenza specifica del dominio che al momento non hanno (VMA _ ### roba). Nemmeno sicuro che è il posto giusto per cercare ...

Ma, da quello che ho raccolto io penso che mremap() Memoria a cura sarebbe stata cancellata, è corretto?

assegnazione viene fatta in questo modo

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

e quindi rimappatura è fatto in questo modo

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

Ah, e ultimo, si tratta di un Linux domanda specifica, l'esecuzione di un kernel recente (> = 2.6.28) e libc (> = 2.11.1)

risposta

4

Le pagine anonime sono mappature copy-on-write di e pagina zero universale. Sono sempre stati (su ogni sistema, non solo su Linux, che offre mappature anonime) e lo saranno sempre. Quando mremap (o brk) estende una mappatura anonima, ottieni nuove pagine anonime (zero). Non è necessario inizializzarli da soli.

+0

Sì. Qualunque cosa tranne le pagine zero sarebbe un buco di sicurezza. –

+0

Ti stai sbagliando sulle mappature copy-on-write della pagina zero universale. Almeno su Linux questo non è il modo in cui 'mmap()' funziona. Le pagine fisiche vengono mappate al primo accesso alla memoria mappata e questo è il gestore degli errori della pagina del kernel che azzera la pagina fisica e la mappa. Nessuna pagina universale zero coinvolta. –

+1

Sei sicuro? Certamente per i mapping anonimi di sola lettura non crea una pagina fisica per ogni pagina. Ciò che ho detto è sicuramente vero in un certo senso se abiliti la fusione di pagine duplicate, ma potrei sbagliarmi in generale; Non ho RTFS o testato. –