Udostępnij za pośrednictwem


Ochrona pamięci

Pamięć, która należy do procesu, jest niejawnie chroniona przez prywatną wirtualną przestrzeń adresową. Ponadto system Windows zapewnia ochronę pamięci przy użyciu sprzętu pamięci wirtualnej. Implementacja tej ochrony różni się w zależności od procesora, na przykład strony kodu w przestrzeni adresowej procesu mogą być oznaczone jako tylko do odczytu i chronione przed modyfikacją przez wątki trybu użytkownika.

Aby uzyskać pełną listę atrybutów, zobacz Stałe ochrony pamięci.

Ochrona przed kopiowaniem na zapis

Ochrona przed kopiowaniem na zapis jest optymalizacją, która umożliwia wielu procesom mapowania wirtualnych przestrzeni adresowych, takich jak udostępnianie strony fizycznej do momentu zmodyfikowania strony przez jeden z procesów. Jest to część techniki o nazwie leniwa ocena, która pozwala systemowi oszczędzać pamięć fizyczną i czas, nie wykonując operacji, dopóki nie będzie to absolutnie konieczne.

Załóżmy na przykład, że dwa procesy ładują strony z tej samej biblioteki DLL do ich wirtualnych miejsc do pamięci. Te strony pamięci wirtualnej są mapowane na te same strony pamięci fizycznej dla obu procesów. Tak długo, jak żaden proces nie zapisuje na tych stronach, może mapować i udostępniać te same strony fizyczne, jak pokazano na poniższym diagramie.

pola i strzałki procesu 1 i 2 stron mapowane na tę samą pamięć fizyczną

Jeśli proces 1 zapisuje na jednej z tych stron, zawartość strony fizycznej zostanie skopiowana na inną stronę fizyczną, a mapa pamięci wirtualnej zostanie zaktualizowana dla procesu 1. Oba procesy mają teraz własne wystąpienie strony w pamięci fizycznej. W związku z tym nie jest możliwe, aby jeden proces zapisywał na udostępnionej stronie fizycznej i w przypadku drugiego procesu w celu wyświetlenia zmian.

pola i strzałki procesów oraz ponowne mapowanie pamięci fizycznej

Ładowanie aplikacji i bibliotek DLL

W przypadku załadowania wielu wystąpień tej samej aplikacji opartej na systemie Windows każde wystąpienie jest uruchamiane we własnej chronionej wirtualnej przestrzeni adresowej. Jednak ich wystąpienia obsługują (hInstance) zwykle mają tę samą wartość. Ta wartość reprezentuje podstawowy adres aplikacji w wirtualnej przestrzeni adresowej. Jeśli każde wystąpienie można załadować do domyślnego adresu podstawowego, może mapować i udostępniać te same strony fizyczne innym wystąpieniom przy użyciu ochrony przed kopiowaniem na zapis. System umożliwia tym wystąpieniom udostępnianie tych samych stron fizycznych, dopóki jedna z nich nie zmodyfikuje strony. Jeśli z jakiegoś powodu nie można załadować jednego z tych wystąpień w żądanym adresie podstawowym, otrzymuje własne strony fizyczne.

Biblioteki DLL są tworzone przy użyciu domyślnego adresu podstawowego. Każdy proces korzystający z biblioteki DLL spróbuje załadować bibliotekę DLL we własnej przestrzeni adresowej na domyślnym adresie wirtualnym dla biblioteki DLL. Jeśli wiele aplikacji może załadować bibliotekę DLL na domyślnym adresie wirtualnym, mogą współużytkować te same strony fizyczne dla biblioteki DLL. Jeśli z jakiegoś powodu proces nie może załadować biblioteki DLL pod adresem domyślnym, ładuje bibliotekę DLL gdzie indziej. Ochrona przed kopiowaniem na zapis wymusza skopiowanie niektórych stron bibliotek DLL do różnych stron fizycznych dla tego procesu, ponieważ poprawki instrukcji skoku są zapisywane na stronach biblioteki DLL i będą one inne w tym procesie. Jeśli sekcja kodu zawiera wiele odwołań do sekcji danych, może to spowodować skopiowanie całej sekcji kodu na nowe strony fizyczne.