Jeśli wirtualna przestrzeń adresowa może być większa niż fizyczna przestrzeń adresowa, w jaki sposób mapowania adresów są przechowywane w pamięci?

15

Powiedzmy, że pracujemy z systemem, który ma 40 bitów adresu fizycznego. Całkowita fizyczna przestrzeń adresowa (przy założeniu, że bajtowo-adresowalna pamięć) wynosi bajtów lub 1 TiB. A jeśli adresy wirtualne mają długość 48 bitów, oznacza to, że w pamięci wirtualnej dostępnych jest więcej adresów niż w lokalizacjach w pamięci fizycznej.2)40

Ma to dla mnie sens, ponieważ „nadmiarowe” adresy mogą również odnosić się do lokalizacji dysków twardych. Jednak nie rozumiem, w jaki sposób odbywa się tłumaczenie między adresami wirtualnymi i fizycznymi. Zakładam, że gdzieś jest zapisane mapowanie, które łączy lokalizacje VAS z lokalizacjami fizycznymi. Jeśli istnieje więcej lokalizacji adresów wirtualnych niż fizycznych, w jaki sposób wszystkie te mapowania mogą być przechowywane w pamięci? Wymagane jest co najmniej 48 bitów do przechowywania każdego adresu wirtualnego, a następnie kolejne 40 do przechowywania fizycznej lokalizacji, na którą mapuje. Oczywiście nie można po prostu zapisać mapowania 1: 1 każdego adresu wirtualnego na jego fizyczny odpowiednik, ponieważ mapowanie każdej lokalizacji zajęłoby więcej pamięci niż samej pamięci fizycznej.

Czego dokładnie tu brakuje?

Brad Power
źródło
Nie możesz tego zrobić nawet przy niewielkiej ilości pamięci i przestrzeni adresowej. Jeśli posiadasz 16-bitowe adresy fizyczne i 16-bitowe adresy wirtualne, nadal nie będziesz w stanie przechowywać wszystkich mapowań 1: 1!
user253751
2
Problem jest bardziej złożony, niż myślisz. Komputery rzadko mają TB pamięci, więc pamięć fizyczna jest ZNACZNIE mniejsza niż wirtualna przestrzeń adresowa. Gorzej: każdy proces ma całkowicie oddzielną wirtualną przestrzeń adresową!
Mooing Duck,
Oprócz lokalizacji na dysku twardym masz tylko bity / miejsce do stracenia. Na przykład możesz mieć duży obszar poniżej stosu niezapisany, aby zapobiec niewykrytym przepełnieniom. Możesz losowo ładować ładunek, zapobiegając innej klasie ataków . Chcesz wskazać jednym bitem, jeśli adres należy do jądra lub użytkownika - śmiało, nawet jeśli marnujesz połowę miejsca. Podczas gdy większość podręczników koncentruje się na rozwiązywaniu aspektu pamięci wirtualnej, jest o wiele więcej.
Maciej Piechotka,
(Zauważ też, że adresy mogą być aliasami, co czasem jest przydatne, więc VA A i adres B odnoszą się do tego samego PA P, mimo że A! = B.)
Maciej Piechotka,

Odpowiedzi:

26

Sztuką wykonania tej pracy jest „stronicowanie”. Przenosząc dane z dysku twardego do pamięci fizycznej, nie zabierasz tylko kilku bajtów. Przynosisz całą stronę. 4k bajtów jest bardzo częstym rozmiarem strony.

Jeśli potrzebujesz tylko śledzić strony, a nie poszczególne bajty, mapowanie staje się znacznie tańsze. Jeśli masz 48-bitową przestrzeń adresową i 4096 stron bajtów, musisz tylko śledzić, która z 2 ^ 36 stron (około 69 miliardów stron). To o wiele łatwiejsze! Zapis miejsca, w którym znajdują się wszystkie strony, znany jest jako „tablica stron”.

Jeśli faktycznie potrzebujesz 1-256 TiB pamięci, to rezygnacja z kilku gigabajtów do przechowywania tej tabeli stron nie jest wielkim problemem. W praktyce będziemy robić takie rzeczy, jak używanie wielopoziomowych tabel stron , co pozwala nam być nieco bardziej wydajne, utrzymując strony tylko dla regionów przestrzeni adresowej, z której faktycznie korzystamy.

Cort Ammon
źródło
6
Plik strony to termin systemu Windows na fizyczny plik na dysku zawierający zawartość fizycznych ramek strony, które zostały odzyskane z powodu braku pamięci i których zawartość należy zachować. Jeśli się nie mylę, struktura danych odwzorowująca adresy stron wirtualnych na fizyczne adresy stron powinna być nazywana tabelą stron .
Przywróć Monikę - ζ--
@hexafraction Myślę, że masz rację. Dokonałem zmiany.
Cort Ammon,
2
Gdy rzeczywista pamięć jest duża, innym sposobem zmniejszenia ilości pamięci potrzebnej na tabele stron jest umożliwienie większych stron. x86 ma opcję mieszania 4 stron KiB ze stronami 2/4 MiB.
Nate Eldredge,