Udostępnij za pomocą


Wirtualne przestrzenie adresowe

Procesory używają adresów wirtualnych podczas odczytywania lub zapisywania w lokalizacjach pamięci. Podczas tych operacji procesor tłumaczy adres wirtualny na fizyczny.

Istnieje kilka korzyści związanych z uzyskiwaniem dostępu do pamięci przy użyciu adresów wirtualnych:

  • Program może używać ciągłego zakresu adresów wirtualnych, aby uzyskać dostęp do dużego, nieciągłego buforu w pamięci fizycznej.

  • Program może używać zakresu adresów wirtualnych, aby uzyskać dostęp do buforu pamięci większego niż dostępna pamięć fizyczna. Gdy pamięć fizyczna jest niska, menedżer pamięci zapisuje strony pamięci fizycznej (zwykle o rozmiarze 4 kilobajtów) do pliku dysku. System przenosi strony danych lub kodu między pamięcią fizyczną a dyskiem zgodnie z potrzebami.

  • Adresy wirtualne używane przez różne procesy są izolowane. Kod w jednym procesie nie może zmienić pamięci fizycznej używanej przez inny proces lub system operacyjny.

Zakres adresów wirtualnych dostępnych dla procesu jest znany jako wirtualna przestrzeń adresowa procesu . Każdy proces trybu użytkownika ma własną prywatną wirtualną przestrzeń adresową.

  • Proces 32-bitowy zwykle ma wirtualną przestrzeń adresową w zakresie 2 gigabajtów 0x00000000 przez 0x7FFFFFFF.

  • Proces 64-bitowy w 64-bitowym systemie Windows ma wirtualną przestrzeń adresową w zakresie 128 terabajtów 0x000'000000000 do 0x7FFF'FFFFFFFF.

Zakres adresów wirtualnych jest czasami nazywany zakresem pamięci wirtualnej. Aby uzyskać więcej informacji, zobacz Limity pamięci i przestrzeni adresowej.

Na poniższym diagramie przedstawiono niektóre kluczowe funkcje wirtualnych przestrzeni adresowych.

Diagram przedstawiający wirtualne przestrzenie adresowe dla dwóch procesów 64-bitowych, Notepad.exe i MyApp.exe.

Na diagramie przedstawiono wirtualne przestrzenie adresowe dla dwóch procesów 64-bitowych: Notepad.exe i MyApp.exe. Każdy proces ma własną wirtualną przestrzeń adresową, od 0x000'00000000 do 0x7FF'FFFFFFFF. Każdy zacieniony blok reprezentuje jedną stronę (4 kilobajty rozmiaru) pamięci wirtualnej lub fizycznej. Proces Notatnika używa trzech sąsiadujących stron adresów wirtualnych, zaczynając od 0x7F7'93950000. Jednak te trzy sąsiadujące strony adresów wirtualnych mapują się na nieciągłe strony w pamięci fizycznej. Ponadto oba procesy używają strony pamięci wirtualnej rozpoczynającej się od 0x7F7'93950000, ale te strony wirtualne mapują na różne strony pamięci fizycznej.

Przestrzeń użytkownika i przestrzeń systemowa

Procesy takie jak Notepad.exe i MyApp.exe działają w trybie użytkownika. Podstawowe składniki systemu operacyjnego i wiele sterowników działa w trybie jądra bardziej uprzywilejowanego. Aby uzyskać więcej informacji na temat trybów procesora, zobacz Tryb użytkownika i tryb jądra.

Każdy proces trybu użytkownika ma własną prywatną wirtualną przestrzeń adresową, ale cały kod uruchamiany w trybie jądra ma jedną wspólną wirtualną przestrzeń adresową, zwaną przestrzenią systemową . Wirtualna przestrzeń adresowa procesu trybu użytkownika nazywa się przestrzenią użytkownika.

W 32-bitowym systemie Windows łączna dostępna wirtualna przestrzeń adresowa wynosi 2^32 bajty (4 gigabajty). Zazwyczaj dolne 2 gigabajty są używane na potrzeby miejsca użytkownika, a górne 2 gigabajty są używane na potrzeby przestrzeni systemowej.

Diagram ilustrujący podział całkowitej dostępnej wirtualnej przestrzeni adresowej w 32-bitowym systemie Windows do przestrzeni użytkownika i przestrzeni systemowej.

W 32-bitowym systemie Windows można określić (w czasie rozruchu), że więcej niż 2 gigabajty są dostępne dla miejsca użytkownika. Oznacza to jednak, że dla przestrzeni systemowej jest dostępnych mniej adresów wirtualnych. Można zwiększyć rozmiar miejsca użytkownika do maksymalnie 3 gigabajtów, pozostawiając tylko 1 gigabajt dla miejsca systemowego. Aby zwiększyć rozmiar przestrzeni użytkownika, użyj BCDEdit /set increaseuserva.

W 64-bitowym systemie Windows teoretyczna ilość wirtualnej przestrzeni adresowej wynosi 2^64 bajty (16 eksabajtów), ale używana jest tylko niewielka część zakresu 16-eksabajtów.

Kod działający w trybie użytkownika może uzyskiwać dostęp do przestrzeni użytkownika, ale nie do przestrzeni systemowej. To ograniczenie uniemożliwia kodowi działającemu w trybie użytkownika odczytywanie lub zmienianie chronionych struktur danych systemu operacyjnego. Kod działający w trybie jądra może uzyskiwać dostęp zarówno do przestrzeni użytkownika, jak i przestrzeni systemowej. Oznacza to, że kod działający w trybie jądra może uzyskać dostęp do przestrzeni systemowej i wirtualnej przestrzeni adresowej bieżącego procesu trybu użytkownika.

Sterowniki działające w trybie jądra muszą być ostrożne podczas bezpośredniego odczytywania z lub zapisywania do adresów w przestrzeni użytkownika. Poniższy scenariusz ilustruje przyczynę.

  1. Program w trybie użytkownika inicjuje żądanie odczytu niektórych danych z urządzenia. Program udostępnia adres początkowy buforu do odbierania danych.

  2. Procedura sterownika urządzenia, działająca w trybie jądra, rozpoczyna operację odczytu i zwraca kontrolę do procesu, który ją wywołał.

  3. Później urządzenie przerywa aktualnie uruchomiony wątek, aby wskazać, że operacja odczytu została ukończona. Procedury sterowników trybu jądra obsługują przerwanie w losowym wątku należącym do dowolnego procesu.

  4. W tym momencie sterownik nie może zapisywać danych na adres początkowy podany w programie trybu użytkownika podanym w kroku 1. Ten adres znajduje się w wirtualnej przestrzeni adresowej procesu, który zainicjował żądanie, co prawdopodobnie nie jest takie samo jak bieżący proces.

Stronicowana pula i niestronicowana pula

W przestrzeni użytkownika wszystkie strony pamięci fizycznej można w razie potrzeby stronicować do pliku na dysku. W przestrzeni systemowej niektóre strony fizyczne mogą podlegać stronicowaniu, a inne nie. Przestrzeń systemowa ma dwa regiony dynamicznego przydzielania pamięci: stronicowana pula i pula niestronicowana.

Pamięć, która jest przydzielona w puli stronicowanej, może być w razie potrzeby wystronicowana do pliku na dysku. Pamięć przydzielona w niestronicowanej puli nigdy nie może być stronicowana do pliku dysku.

Diagram przedstawiający różnicę w alokacji pamięci w puli stronicowanej.

Węzły urządzeń i stosy urządzeń

tryb użytkownika i tryb jądra