2014-05-06 9 views
5

To mi wygląda MAP_POPULATE nie tylko dla prywatnych odwzorowań, wbrew temu, co twierdzi strona człowiek mówi:Linux mmap() z MAP_POPULATE, strona człowiek wydaje się dawać nieprawidłowe info

MAP_POPULATE (od Linuksa 2.5 . 46) Zapełnianie (przedwczesne) tabel stron dla mapowania. W przypadku mapowania pliku, powoduje to wczytanie pliku do przodu. Później dostęp do mapowania nie zostanie zablokowany przez błędy strony. MAP_POPULATE obsługuje tylko prywatne odwzorowania od Linuksa 2.6.23.

podstawie moich pobieżnych oględzin źródła jądra Linux na mmap.c, wygląda MAP_POPULATE ma absolutnie żadnego związku z MAP_PRIVATE ogóle w versions going back as far as 2.6.34.

Oto fragment najnowszego kodu z mmap.c jako realizacji jądra 3.14:

... 
1364   addr = mmap_region(file, addr, len, vm_flags, pgoff); 
1365   if (!IS_ERR_VALUE(addr) && 
1366    ((vm_flags & VM_LOCKED) || 
1367    (flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE)) 
1368     *populate = len; 
1369   return addr; 
... 

mylę w moich obserwacji?

+0

Przeczytałem tę uwagę jako "przed 2.6.23, MAP_POPULATE nie było obsługiwane dla mapowań prywatnych" (bez informacji o MAP_POPULATE dla mapowań nieprywatnych). –

+0

Sądzę, że można to zinterpretować w ten sposób. Może "oni" muszą zmienić język, aby był mniej dwuznaczny. –

Odpowiedz

5

Brzmienie artykułu zostało zaktualizowane skoro zadał pytanie:

Before: MAP_POPULATE is only supported for private mappings since Linux 2.6.23. 
After: MAP_POPULATE is supported for private mappings only since Linux 2.6.23. 

Innymi słowy, można użyć MAP_POPULATE prywatnych odwzorowań, ale trzeba przynajmniej Linux 2.6.23.

Mam nadzieję, że to wyjaśni!

+0

Nie sądzę, aby sformułowanie w ogóle pomogło w dwuznaczności. Kiedy koledzy i ja przeczytaliśmy to na drugi dzień, zinterpretowaliśmy to jako 'MAP_POPULATE jest obsługiwany (tylko dla prywatnych mapowań) od Linuksa 2.6.23." Oznacza to, że wydaje się, że obsługuje on tylko prywatne mapowania w późniejszych wersjach jądro. Polecam coś w rodzaju: "Ponieważ Linux 2.6.23 MAP_POPULATE działa zarówno dla odwzorowań prywatnych, jak i współdzielonych. Przed wersją 2.6.23 obsługiwane były tylko wspólne mapowania. " –