Dlaczego Debian Linux pozwala na wirtualną przestrzeń adresową do 128 TB na proces, a jedynie pamięć fizyczną 64 TB?

23

Właśnie przeczytałem tutaj :

  • wirtualna przestrzeń adresowa do 128 TB na proces (zamiast 2GiB)
  • Obsługa pamięci fizycznej 64TiB zamiast 4GiB (lub 64GiB z rozszerzeniem PAE)

Dlaczego? Mam na myśli, że obsługa pamięci fizycznej jest ograniczona przez jądro lub obecny sprzęt?

Dlaczego miałbyś potrzebować dwa razy więcej pamięci wirtualnej niż pamięć fizyczna, którą faktycznie możesz rozwiązać?

gsi-frank
źródło
Możesz także dodać swap.
Thorbjørn Ravn Andersen
2
to dużo pamięci RAM ...
dalearn
4
@dalearn - wiesz, kiedy po raz pierwszy dowiedziałem się, że możesz uzyskać rozszerzenie pamięci z przełączaniem banków dla 8-bitowych mikrów, które pozwalają im mieć do 4096 KB, powiedziałem dokładnie to samo ...
Jules

Odpowiedzi:

35

Te ograniczenia nie pochodzą z Debiana ani z Linuksa, lecz ze sprzętu. Różne architektury (procesor i magistrala pamięci) mają różne ograniczenia.

W obecnych procesorach x86-64 PC MMU pozwala na 48 bitów wirtualnej przestrzeni adresowej . Oznacza to, że przestrzeń adresowa jest ograniczona do 256 TB. Jeden bit odróżnia adresy jądra od adresów użytkowników, co pozostawia 128 TB na przestrzeń adresową procesu.

W obecnych procesorach x86-64 adresy fizyczne mogą wykorzystywać do 48 bitów , co oznacza, że ​​możesz mieć do 256 TB. Limit stopniowo wzrastał od czasu wprowadzenia architektury amd64 (z 40 bitów, jeśli dobrze pamiętam). Każdy bit przestrzeni adresowej kosztuje pewną logikę okablowania i dekodowania (co sprawia, że ​​procesor jest droższy, wolniejszy i cieplejszy), więc producenci sprzętu mają motywację do zmniejszenia jego rozmiaru.

Linux zezwala jedynie na zwiększenie adresów fizycznych do 2 ^ 46 (więc możesz mieć tylko do 64 TB), ponieważ pozwala na całkowite odwzorowanie pamięci fizycznej w przestrzeni jądra. Pamiętaj, że jest 48 bitów przestrzeni adresowej; jeden bit dla jądra / użytkownika pozostawia 47 bitów dla przestrzeni adresowej jądra. Połowa z nich co najwyżej odnosi się bezpośrednio do pamięci fizycznej, a druga połowa pozwala jądru mapować wszystko, czego potrzebuje. (Linux może poradzić sobie z pamięcią fizyczną, której nie można jednocześnie zmapować w całości, ale wprowadza to dodatkową złożoność, więc jest to wykonywane tylko na platformach, gdzie jest to wymagane, takich jak x86-32 z PAE i armv7 z LPAE.)

Przydatne jest, aby pamięć wirtualna była większa niż pamięć fizyczna z kilku powodów:

  • Pozwala jądru mapować całą pamięć fizyczną i pozostawia miejsce na wirtualne pinezki map.
  • Oprócz mapowania pamięci fizycznej istnieją mapowania wymiany, plików i sterowników urządzeń.
  • Przydatne jest posiadanie niezmapowanej pamięci w miejscach: strzeż strony, aby złapać przepełnienie bufora , duże niezmapowane strefy z powodu ASLR itp.
Gilles „SO- przestań być zły”
źródło
9
46-bitowe ograniczenie pamięci fizycznej jest związane z mapą pamięci systemu Linux : obejmuje pełne mapowanie pamięci fizycznej w przestrzeni jądra, co oznacza, że ​​pamięć fizyczna może odpowiadać tylko jednej czwartej dostępnej przestrzeni adresowej.
Stephen Kitt,
Czy ktoś mógłby opracować komentarz na @StephenKitt? Bardzo mnie to interesuje, ale nawet po przeczytaniu cytowanego
przeze
@ gsi-frank Dla jądra wygodnie jest na stałe zmapować całą pamięć fizyczną. Tak więc w przestrzeni adresowej 2 ^ 48 2 ^ 47 idzie na adresy użytkowników, 2 ^ 46 idzie na adresy jądra, a 2 ^ 46 służy do adresowania pamięci fizycznej.
Gilles „SO- przestań być zły”
@ gsi-frank Jeśli możesz zdobyć egzemplarz klasycznej książki „ Opracowywanie własnego 32-bitowego systemu operacyjnego ”, wnikają one głęboko w powód, dla którego autor podjął podobną decyzję dotyczącą własnego systemu operacyjnego (w tym przypadku dzielenie wirtualnej przestrzeni adresowej 4GiB 80386 na segment jądra 2GiB, który zawiera fizyczne mapowanie 1GiB RAM i segment użytkownika 2GiB). Każdy zainteresowany wewnętrznymi systemami operacyjnymi powinien je przeczytać - zapewnia pełny projekt wystarczająco prosty do zrozumienia, ale wystarczająco zaawansowany, aby był przydatnym jądrem systemu operacyjnego.
Jules
Od wersji 4.13 jądra x86-64 (i niektóre inne architektury) można budować za pomocą pięciopoziomowych stronicowania , które zwiększają przestrzeń adresową na x86-64 do 52 bitów dla fizycznej pamięci RAM i 57 bitów dla wirtualnej (4 PiB / 128 PiB). Zauważ, że mapa pamięci w przestrzeni jądra wprowadza problemy bezpieczeństwa, więc to może się zmienić w najbliższej przyszłości.
Stephen Kitt
9

Nie wiem dlaczego, ale mogę wymyślić siedem powodów, dla których warto byłoby obsługiwać dwa razy więcej przestrzeni adresowej niż pamięć fizyczna.

  1. Po pierwsze, możesz uruchamiać aplikacje wymagające dodatkowej pamięci - nawet jeśli oznacza to zamianę dysku.
  2. Czystsze układy pamięci do wykorzystania pamięci partycji. Na przykład system operacyjny może przyjmować adresy o wyższym numerze i pozostawić adresy o niższym numerze dla aplikacji, aby separacja była czystsza.
  3. Randomizacja układu przestrzeni adresowej jest nieco bardziej skuteczna.
  4. Oznaczanie stron jako wykonywalnych może oznaczać pozostałą pamięć.
  5. We / wy mapowane na pamięć.
  6. Przydział pamięci jest łatwiejszy: można przydzielić większe porcje na raz.
  7. Zmniejszona fragmentacja pamięci
lungj
źródło
1
Dzięki! 1) jest tak oczywisty i podstawowy, że zawstydzam się tym pytaniem;)
gsi-frank
2
(3) jest również bardzo ważne. Ty naprawdę chcesz wirtualną przestrzeń adresową, która jest o rząd wielkości większej niż ilość pamięci będziesz przydziale tak, że przypadkowe domysły prawie na pewno spowoduje pułapki.
R ..
6

Są to ograniczenia sprzętowe. Obecny sprzęt x86_64 / amd64 pozwala na 48-bitowe adresy wirtualne i różne rozmiary (w zależności od implementacji - np. Moja stacja robocza obsługuje tylko 36 bitów) adresów fizycznych. Jądro Linux dzieli wirtualną przestrzeń adresową na pół (wykorzystując połowę dla jądra, połowę dla przestrzeni użytkownika - tak jak robi to na x86).

Otrzymujesz:

2⁴⁸ bajtów ÷ 2 = 2⁴⁷ bajtów = 128 TiB

Rozmiar adresu fizycznego jest często mniejszy, ponieważ w rzeczywistości jest fizyczny. Zajmuje piny / pady, tranzystory, połączenia itp. Na / w CPU i linie śledzenia na płycie. Prawdopodobnie tak samo w chipsetach. Nie ma sensu obsługiwać pamięci RAM, która jest nie do pomyślenia w całym okresie użytkowania rdzenia procesora lub gniazda - wszystko to kosztuje. (Nawet z 32 gniazdami DIMM i 64GiB DIMM w każdym, nadal masz tylko 2 TB. Nawet jeśli pojemność DIMM podwaja się w ciągu roku, jesteśmy o 5 lat od 64 TB.

Jak zauważa Peter Cordes , ludzie podłączają teraz nieulotną pamięć masową, taką jak 3D XPoint, do szyny pamięci, co sprawia, że ​​możliwe jest wyczerpanie się przestrzeni adresowej. Nowsze procesory rozszerzyły fizyczną przestrzeń adresową do 48 bitów; możliwe, że wiki Debiana po prostu nie została zaktualizowana.

derobert
źródło
Nieulotna pamięć podłączona bezpośrednio do magistrali pamięci (np. 3D XPoint) staje się rzeczą, a to może znacznie zwiększyć zapotrzebowanie na fizyczną przestrzeń adresową w ciągu najbliższych kilku lat (ponieważ jest ona gęstsza niż DRAM i przydatne jest, aby mieć jej mnóstwo łodzi) w większej liczbie przypadków niż przydatne jest posiadanie dużej ilości pamięci RAM). Zobacz zdnet.com/article/the-non-volatile-memory-revolution, aby uzyskać niezbyt techniczny artykuł (lub google, aby uzyskać lepsze informacje). Intel Skylake obsługuje to za pomocą instrukcji clflushi clflushoptinstrukcji.
Peter Cordes,
1
Możesz już kupić systemy z maksymalnie 12 TB pamięci RAM w 96 gniazdach ( na przykład czteroprocesorowy system HPC Tyana ), więc 64TiB może być za niespełna pięć lat. A niektórzy kupują je i wyposażają w tak dużo pamięci RAM ...
Stephen Kitt,
@StephenKitt hmm, jest OK, ponieważ pojemność DIMM zajmuje prawie 3 lata, aby podwoić 😁
derobert
Okazuje się, że można teraz kupić systemy z 64 TiB pamięci RAM .
Stephen Kitt