2011-12-14 14 views
13

Powiedz, że przydzielam dużą pamięć (40 MB) za pomocą mmap używając/dev/zero w następujący sposób.mmap z/dev/zero

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0); 

Co rozumiem, jest to, że jądro zainicjuje pamięć do zera, gdy strony są wprowadzone do pamięci fizycznej (przypuszczam nowoczesne jądra Linuksa używać Demand stronicowania). Na przykład, kiedy pierwsza strona zostanie dotknięta i przeniesiona do pamięci fizycznej, jądro zainicjuje wszystkie 4096 bajtów na zero, a kiedy dotknie drugiej strony, robi to samo i tak dalej.

Czy moje zrozumienie jest prawidłowe?

+2

Krótka odpowiedź: Tak – hirschhornsalz

+0

Tak długo jak dotyk oznacza pisanie, tak. W przeciwnym razie, jeśli po prostu czytasz ze strony zerowej, jest rzeczywiście jedna strona zerowa, która będzie KROKOWANA przy pierwszym zapisie. – ninjalj

+0

To będzie ciężko działać na Androidzie 5.0, ponieważ SELinux zablokuje takie dziwactwo. Dlatego Inkscape w chroot nie uruchamia się na Androidzie. – pelya

Odpowiedz

11

Tak, jeszcze więcej stron powstaje tylko wtedy, gdy dotkniesz ich po raz pierwszy.

BTW, jest flaga MAP_ANONYMOUS, której można użyć w tej sytuacji, nie trzeba otwierać deskryptora pliku na /dev/null.

+0

MAP_ANONYMOUS tworzy także pamięć 0? Co jeśli nie chcę, aby pamięć była zerowa, aby uniknąć narzutu inicjowania pamięci na zero? W co więc powinienem użyć? – MetallicPriest

+6

@MetallicPriest Nic. Dowolna niezainicjowana pamięć bez pliku, która może przeciekać zawartość pamięci innego procesu lub jądra. – ephemient

+3

Użyj/dev/urandom zamiast/dev/zero, jeśli nie chcesz, aby przestrzeń była wypełniona zerami? :) Jądro nie ma firmy, która da ci pamięć, która może zawierać resztki z czyjegoś programu działającego w tej samej pamięci - jest to zagrożenie bezpieczeństwa. –

Powiązane problemy