2011-11-02 13 views
5

jakbym mmap() niektóre PRYWATNE i anonimowe stron, a następnie rozszerzyć je mremap(), czy nowa przestrzeń się również inicjowane zerami?Czy mremap "inicjalizuje" pamięć na wzrost?

Próbowałem czytać kod mremap (mm/mremap.c) w źródłach Linuksa, ale to wymaga pewnej wiedzy specyficzne dla domeny, które nie mają obecnie (VMA _ ### rzeczy). nawet nie wiesz, że to właściwe miejsce, aby wyglądać ...

Ale, z tego co ja zebrane myślę że mremap() Pamięć ed będzie wyczyszczone, jest to prawidłowe?

Przydział odbywa się ten

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

a następnie remap odbywa się ten

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

Ah, i ostatni, to Linux konkretne pytanie, uruchomiony niedawno jądro (> = 2.6.28) i libc (> = 2.11.1)

Odpowiedz

4

Strony anonimowe to odwzorowania kopiowania przy zapisie e uniwersalna strona zerowa. Zawsze były (na każdym systemie, nie tylko na Linuksie, który oferuje anonimowe mapowania) i zawsze będą. Gdy mremap (lub brk) rozszerza anonimowe mapowanie, otrzymujesz nowe anonimowe (zero) strony. Nie ma potrzeby inicjowania ich samemu.

+0

Tak. Wszystko oprócz zerowych stron byłoby również luką bezpieczeństwa. –

+0

Mylisz się o mapowania kopiowania przy zapisie uniwersalnej strony zerowej. Przynajmniej w Linuksie nie jest tak, jak działa 'mmap()'. Dostajesz fizyczne strony odwzorowane przy pierwszym dostępie do zmapowanej pamięci, i jest to procedura obsługi błędów strony kernela, która zeruje fizyczną stronę i mapuje ją. Brak uniwersalnej strony zerowej. –

+1

Czy jesteś pewien? Z pewnością dla anonimowych odwzorowań tylko do odczytu nie tworzy fizycznej strony dla każdej strony. To, co powiedziałem, jest w pewnym sensie prawdziwe, jeśli umożliwisz scalanie duplikatów, ale ogólnie mogę się mylić; Nie RTFS go przetestowałem. –

Powiązane problemy