Co powoduje błędy strony?

Według Wikipedii :

Błąd strony jest pułapką na oprogramowanie podnoszone przez sprzęt, gdy program uzyskuje dostęp do strony, która jest mapowana w wirtualnej przestrzeni adresowej, , ale nie jest ładowana w pamięci fizycznej .

Okay, to ma sens.

Ale jeśli tak jest, to dlaczego za każdym razem, gdy informacje o procesie w Process Hacker jest odświeżany, widzę około 15 błędów strony?

Zrzut ekranu

Lub innymi słowy, dlaczego czy jakaś pamięć jest wywoływana? (Nie mam pojęcia, czy to pamięć użytkownika czy jądra.) Mam nie plik strony, a zużycie pamięci RAM wynosi około 1,2 GB z 4 GB, czyli po czystym restarcie. Nie brakuje żadnych zasobów; dlaczego cokolwiek miałoby być wysyłane na pager?

Author: Michael Mrozek, 2011-04-16

7 answers

(jestem autorem Process Hacker.)

Po Pierwsze:

Błąd strony to pułapka na oprogramowanie podniesiony przez sprzęt, gdy program uzyskuje dostęp do strony zmapowanej w wirtualna przestrzeń adresowa, ale nie wczytana w pamięci fizycznej.

To nie jest do końca poprawne, jak wyjaśniono później w tym samym artykule (Drobny Błąd strony ). Istnieją błędy strony miękkiej, gdzie jedyne, co musi zrobić jądro, to dodać stronę do roboczego zestawu procesu. Oto tabela z książki Windows Internals (wykluczyłem te, które skutkują naruszeniem dostępu):

  • powód błędu- wynik
  • dostęp do strony, która nie jest rezydentna w pamięci, ale znajduje się na dysku w pliku Strony lub zmapowanym pliku- Przydziel fizyczną stronę i odczytaj żądaną stronę z dysku i do odpowiedniego zestawu roboczego
  • dostęp do strony, która znajduje się na liście standby lub modified - Przejście strony do odpowiedniego procesu, session, or system working set
  • dostęp do strony zerowej - Dodaj stronę zerową do odpowiedniego zestawu roboczego
  • W przeciwieństwie do innych systemów, które nie są w pełni kompatybilne z procesami, nie są w pełni kompatybilne z procesami i nie są w pełni kompatybilne z procesami.]}

Błędy strony mogą wystąpić z różnych powodów, jak widać powyżej. Tylko jeden z nich ma do czynienia z odczytem z dysku. Jeśli spróbujesz przydzielić blok z sterta i menedżer sterty przydziela nowe strony, a następnie uzyskuje dostęp do tych stron, otrzymasz błąd strony zero popytu. Jeśli spróbujesz zaczepić funkcję w kernel32, pisząc na stronach kernel32, pojawi się błąd kopiowania przy zapisie, ponieważ te strony są kopiowane po cichu, więc twoje zmiany nie wpływają na inne procesy.

Teraz, aby odpowiedzieć na twoje pytanie dokładniej: Process Hacker tylko wydaje się mieć błędy strony podczas aktualizacji informacji o swojej usłudze - to znaczy, gdy wywołuje EnumServicesStatusEx , które RPCs do SCM (usługi.exe). Domyślam się, że w tym procesie alokowana jest duża ilość pamięci, co prowadzi do błędów demand-zero page (informacje o usłudze wymagają przechowywania kilku stron, IIRC).

 36
Author: wj32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-17 00:41:25

Powolnym, ale stabilnym źródłem błędów stron jest system operacyjny sprawdzający rzadko odwiedzane strony. W tym przypadku system operacyjny zaznacza niektóre strony, które nie są obecne, ale pozostawia je w pamięci tak, jak jest. Jeśli aplikacja uzyskuje dostęp do strony, wtedy pojawia się pułapka #PF i system operacyjny po prostu zaznacza stronę obecną ponownie bez dalszych ceregieli. Jeśli" długi czas " minie, a strona nigdy nie potknie się o błąd, System operacyjny wie, że strona jest dobrym kandydatem do zamiany, jeśli zajdzie taka potrzeba. Mechanizm ten może działać aktywnie nawet w czasach braku presji na zasoby.

 5
Author: srking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 18:27:37

"strona, która jest mapowana w wirtualnej przestrzeni adresowej, ale nie jest ładowana do pamięci fizycznej" nie oznacza, że wcześniej znajdowała się w pamięci fizycznej. Załóżmy, że mapujesz plik? Wciąż jest na dysku, jeszcze nie w pamięci.

Załóżmy, że mapujesz plik dziennika i dodajesz go do niego. Za każdym razem, gdy przekroczysz koniec zatwierdzonej pamięci, wystąpi błąd strony, System operacyjny dostarczy Ci nową pustą stronę i dostosuje długość pliku.


Mogą to być również naruszenia dostępu, które są przechwytywane i obsługiwane przez program.


może być również tak, że program używa więcej segmentów pamięci niż mieści się w TLB (który jest buforem tabel stron). Gdy strony są sąsiadujące ze sobą, wszystkie mogą być obsługiwane przez pojedynczy wpis tabeli strony. Ale jeśli pamięć jest fragmentowana w fizycznej przestrzeni adresowej, wiele wpisów tabeli stron jest potrzebnych i mogą nie zmieścić się w TLB. Gdy wystąpi błąd TLB, wywoływany jest moduł obsługi błędów strony systemu operacyjnego i wyszukuje mapowanie na stronie procesu stolik.

W pewnym sensie jest to odmiana odpowiedź Deana : strony są już w fizycznej pamięci RAM, a system operacyjny musi załadować te mapowania do TLB, ale nie z powodu IPC.

Brian zauważył, że x86 (a więc wszystkie systemy Win32) obsługuje to bez błędu strony.


Kolejną przyczyną błędów stron jest wyzwalanie stron ochronnych używanych do wzrostu stosu i kopiowania przy zapisie, ale zwykle nie występują one bez bound. Nie mam 100 lat.% pewne, czy będą one wyświetlane jako naruszenia dostępu, czy nie, ponieważ będą oznaczone jako naruszenie dostępu przy wejściu do pułapki MMU, ale prawdopodobnie są obsługiwane przez obsługę błędów strony systemu operacyjnego i nie przekształcone w naruszenie dostępu w trybie użytkownika (SEH).

 4
Author: Ben Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Za każdym razem, gdy czyta się sekcję mmap, generowany jest błąd strony, który obejmuje każdorazowe ładowanie biblioteki DLL. Tak więc wczytywanie biblioteki DLL nie odczytuje wszystkich bibliotek DLL do pamięci, tylko powoduje, że zostanie ona uszkodzona podczas wykonywania kodu.

 2
Author: Paul Betts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 04:13:02

Zobaczysz błędy strony miękkiej , gdy pamięć jest współdzielona między procesami. Zasadniczo, jeśli Masz plik mapowany pamięcią współdzielony między dwoma procesami, gdy drugi proces ładuje plik mapowany pamięcią, generowane są błędy strony miękkiej - pamięć jest już w fizycznej pamięci RAM, ale system operacyjny musi naprawić tabele Menedżera pamięci, aby adres pamięci wirtualnej w procesie wskazywał na właściwą stronę fizyczną.

Szczególnie dla czegoś takiego Process Hacker, który prawdopodobnie wstrzykuje kod do każdego uruchomionego procesu (w celu zebrania informacji), prawdopodobnie dość intensywnie wykorzystuje pamięć współdzieloną do robienia IPC.

 1
Author: Dean Harding,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 04:11:19

Systemy operacyjne wykorzystują stronicowanie do grupowania elementów, które należy umieszczać w pamięci fizycznej i przenosić między pamięcią fizyczną a pamięcią współdzieloną. w większości przypadków elementy danych umieszczone na jednej stronie są ze sobą powiązane. gdy elementy danych na stronie nie są używane przez dłuższy czas, system operacyjny przenosi je do pamięci wirtualnej, aby zwolnić trochę miejsca w pamięci fizycznej. a gdy strona jest wymagana, system operacyjny przenosi ją z pamięci wirtualnej (dysku twardego) do pamięć fizyczna. to wina strony !

I pamiętaj, że różne systemy operacyjne różnią się w algorytmach stronicowania.

Podstawy błędów strony

 0
Author: Farzin Zaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 04:11:36

Alokacja zasobów to delikatna równowaga między utrzymaniem podstawowej pamięci masowej dostępnej do użytku a zapobieganiem konieczności przechodzenia na wtórną w jak największym stopniu. Jeśli proces próbuje przydzielić pamięć i nie może, zwykle jest to wyjątek, a czasami wyjątek krytyczny.

Zasadniczo nie można przechowywać wszystkiego w pamięci RAM bez wolnych zasobów, ponieważ gdy program uruchomi się lub poprosi o więcej, zawiesi się.

 0
Author: Bacon Bits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 04:13:25