W książce przeczytałem:
Procesory 32-bitowe mają 2 ^ 32 możliwych adresów, podczas gdy obecne procesory 64-bitowe mają 48-bitową przestrzeń adresową
Spodziewałem się, że jeśli jest to procesor 64-bitowy, przestrzeń adresowa również powinna wynosić 2 ^ 64.
Zastanawiałem się więc, jaki jest powód tego ograniczenia?
The 32-bit processors have 2^32 possible addresses
niekoniecznie jest prawdą, może istnieć 32-bitowy procesor z tylko 24 "pinami" do adresowania pamięci. Np. 68EC020 (tańsza wersja 68020) jest 32-bitowym procesorem, ale z 24 bitami do adresowania pamięci.Odpowiedzi:
Ponieważ to wszystko, czego potrzeba. 48 bitów daje przestrzeń adresową 256 terabajtów. To dużo. W najbliższym czasie nie zobaczysz systemu, który potrzebuje czegoś więcej.
Dlatego producenci procesorów poszli na skróty. Używają zestawu instrukcji, który pozwala na pełną 64-bitową przestrzeń adresową, ale obecne procesory używają tylko dolnych 48 bitów. Alternatywą było marnowanie tranzystorów na obsługę większej przestrzeni adresowej, która nie będzie potrzebna przez wiele lat.
Kiedy więc zbliżymy się do 48-bitowego limitu, wystarczy zwolnić procesory obsługujące pełną przestrzeń adresową, ale nie będzie to wymagało żadnych zmian w zestawie instrukcji i nie zepsuje kompatybilności.
źródło
Każda odpowiedź odnosząca się do rozmiaru magistrali i pamięci fizycznej jest nieco błędna, ponieważ pytanie OP dotyczyło wirtualnej przestrzeni adresowej, a nie fizycznej przestrzeni adresowej . Na przykład rzekomo analogicznym ograniczeniem dla niektórych 386 było ograniczenie fizycznej pamięci, której mogliby używać, a nie wirtualna przestrzeń adresowa, która zawsze miała pełne 32 bity. W zasadzie można używać pełnych 64 bitów wirtualnej przestrzeni adresowej, nawet mając zaledwie kilka MB pamięci fizycznej; oczywiście można to zrobić przez zamianę lub w przypadku wyspecjalizowanych zadań, w których chcesz zmapować tę samą stronę na większość adresów (np. pewne operacje na rzadkich danych).
Myślę, że prawdziwą odpowiedzią jest to, że AMD było po prostu tanie i miał nadzieję, że teraz nikogo to nie obchodzi, ale nie mam żadnych odniesień do cytowania.
źródło
__far
(lub co gorsza,FAR
/far
!) Wskaźników ...Przeczytaj sekcję dotyczącą ograniczeń w artykule na Wikipedii :
Oznacza to, że na tym etapie nie ma sensu wdrażać pełnego adresowania 64-bitowego, ponieważ nie możemy zbudować systemu, który mógłby w pełni wykorzystać taką przestrzeń adresową - więc wybieramy coś, co jest praktyczne dla dzisiejszych (i jutrzejszych) systemów.
źródło
Wewnętrzna natywna szerokość rejestru / operacji nie musi być odzwierciedlona w szerokości zewnętrznej magistrali adresowej.
Załóżmy, że masz 64-bitowy procesor, który potrzebuje tylko 1 megabajta pamięci RAM. Wystarczy 20-bitowa magistrala adresowa. Po co zawracać sobie głowę kosztami i złożonością sprzętu wszystkich dodatkowych pinów, których nie będziesz używać?
Motorola 68000 była taka; 32-bitowy wewnętrznie, ale z 23-bitową magistralą adresową (i 16-bitową magistralą danych). Procesor mógł uzyskać dostęp do 16 megabajtów pamięci RAM, a załadowanie rodzimego typu danych (32 bity) wymagało dwóch dostępów do pamięci (każdy zawierał 16 bitów danych).
źródło
Istnieje poważniejszy powód niż tylko zapisywanie tranzystorów w ścieżce adresowej procesora: jeśli zwiększysz rozmiar przestrzeni adresowej, musisz zwiększyć rozmiar strony, zwiększyć rozmiar tabel stron lub mieć głębszą strukturę tabel stron (to więcej poziomów tabel tłumaczeń). Wszystkie te rzeczy zwiększają koszt chybienia TLB, co obniża wydajność.
źródło
Z mojego punktu widzenia wynika to z rozmiaru strony. Każda strona zawiera najwyżej 4096/8 = 512 wpisów tablicy stron. I 2 ^ 9 = 512. Czyli 9 * 4 + 12 = 48.
źródło
Odpowiadając na pierwotne pytanie: nie było potrzeby dodawania więcej niż 48 bitów PA.
Serwery potrzebują maksymalnej ilości pamięci, więc spróbujmy sięgnąć głębiej.
1) Największa (powszechnie używana) konfiguracja serwera to system 8 gniazd. System 8S to nic innego jak 8 procesorów serwerowych połączonych za pomocą spójnego połączenia o dużej szybkości (lub po prostu szybkiej „magistrali”) w celu utworzenia pojedynczego węzła. Istnieją większe klastry, ale jest ich niewiele, mówimy tutaj o powszechnie używanych konfiguracjach. Zwróć uwagę, że w prawdziwym świecie system 2 Socket jest jednym z najczęściej używanych serwerów, a 8S jest zwykle uważany za bardzo wysokiej klasy.
2) Główne typy pamięci używanych przez serwery to bajtowa adresowalna zwykła pamięć DRAM (np. Pamięć DDR3 / DDR4), Memory Mapped IO - MMIO (np. Pamięć używana przez kartę rozszerzeń), a także Przestrzeń konfiguracyjna używana do konfiguracji urządzenia obecne w systemie. Pierwszym typem pamięci jest ta, która jest zwykle największa (i dlatego wymaga największej liczby bitów adresu). Niektóre serwery wysokiej klasy używają również dużej ilości MMIO w zależności od faktycznej konfiguracji systemu.
3) Załóżmy, że każdy procesor serwera może pomieścić 16 modułów DDR4 DIMM w każdym gnieździe. Z maksymalnym rozmiarem DDR4 DIMM 256 GB. (W zależności od wersji serwera, ta liczba możliwych modułów DIMM na gniazdo jest w rzeczywistości mniejsza niż 16 modułów DIMM, ale kontynuuj czytanie dla przykładu).
Zatem każde gniazdo może teoretycznie mieć 16 * 256 GB = 4096 GB = 4 TB. W naszym przykładowym systemie 8S rozmiar pamięci DRAM może wynosić maksymalnie 4 * 8 = 32 TB. Oznacza to, że maksymalna liczba bitów potrzebnych do zaadresowania tej przestrzeni DRAM wynosi 45 (= log2 32 TB / log2 2).
Nie będziemy wchodzić w szczegóły innych typów pamięci (MMIO, MMCFG itp.), Ale chodzi o to, że najbardziej „wymagający” typ pamięci dla systemu 8-gniazdowego z największymi dostępnymi obecnie typami DDR4 DIMM (256 GB DIMM) używają tylko 45 bitów.
W przypadku systemu operacyjnego obsługującego 48 bitów (na przykład WS16) pozostają (48-45 =) 3 pozostałe bity. Co oznacza, że jeśli użyliśmy dolnych 45 bitów wyłącznie dla 32 TB pamięci DRAM, nadal mamy 2 ^ 3 razy więcej pamięci adresowalnej, która może być wykorzystana do MMIO / MMCFG, co daje łącznie 256 TB przestrzeni adresowalnej.
Podsumowując: 1) 48 bitów adresu fizycznego to mnóstwo bitów do obsługi największych współczesnych systemów, które są „w pełni załadowane” dużą ilością pamięci DDR4, a także wieloma innymi urządzeniami IO, które wymagają przestrzeni MMIO. Dokładnie 256 TB.
Zauważ, że ta przestrzeń adresowa 256 TB (= 48 bitów adresu fizycznego) NIE obejmuje żadnych dysków, takich jak dyski SATA, ponieważ NIE są one częścią mapy adresów, zawierają tylko pamięć, która jest adresowalna bajtowo i jest widoczna dla systemu operacyjnego.
2) Sprzęt CPU może zdecydować się na implementację 46, 48 lub> 48 bitów w zależności od generacji serwera. Ale innym ważnym czynnikiem jest to, ile bitów rozpoznaje system operacyjny. Obecnie WS16 obsługuje 48-bitowe adresy fizyczne (= 256 TB).
Dla użytkownika oznacza to, że nawet jeśli ma się duży, ultranowoczesny procesor serwera, który może obsługiwać> 48 bitów adresowania, jeśli używasz systemu operacyjnego, który obsługuje tylko 48 bitów PA, możesz skorzystać tylko z 256 TB .
3) Podsumowując, istnieją dwa główne czynniki, które pozwalają wykorzystać większą liczbę bitów adresu (= większa pojemność pamięci).
a) Ile bitów obsługuje Twój sprzętowy procesor? (Można to określić za pomocą instrukcji CPUID w procesorach Intel).
b) jaką wersję systemu operacyjnego używasz i ile bitów PA rozpoznaje / obsługuje.
Min z (a, b) ostatecznie określi ilość adresowalnej przestrzeni, z której system może skorzystać.
Napisałem tę odpowiedź bez szczegółowego rozpatrywania innych odpowiedzi. Nie zagłębiałem się też szczegółowo w niuanse MMIO, MMCFG i całej konstrukcji mapy adresowej. Ale mam nadzieję, że to pomoże.
Dzięki, Anand K Enamandram, Server Platform Architect Intel Corporation
źródło
Wiele osób ma to błędne przekonanie. Ale obiecuję wam, jeśli to uważnie przeczytacie, po przeczytaniu tego wszystkie wasze błędne przekonania staną się jasne.
Powiedzieć, że procesor 32-bitowy lub 64-bitowy nie oznacza, że powinien mieć odpowiednio 32-bitową magistralę adresową lub 64-bitową magistralę adresową! ... Powtarzam to NIE TAK!
32-bitowy procesor oznacza, że ma 32-bitową jednostkę ALU (jednostka arytmetyczna i logiczna) ... co oznacza, że może działać na 32-bitowym operandzie binarnym (lub po prostu mówiąc liczbę binarną składającą się z 32 cyfr) i podobnie 64-bitowy procesor może działać na 64-bitowym binarnym operand. Tak więc pogoda procesor 32-bitowy lub 64-bitowy NIE oznacza maksymalnej ilości pamięci, którą można zainstalować. Pokazują tylko, jak duży może być operand ... (dla analogii można pomyśleć o 10-cyfrowym kalkulatorze, który może obliczyć wyniki do 10 cyfr ... nie może dać nam 11 cyfr ani żadnych innych większych wyników ... chociaż tak jest dziesiętnie, ale mówię tę analogię dla uproszczenia) ... ale to, co mówisz, to przestrzeń adresowa, która jest maksymalnym rozmiarem pamięci (RAM), który można bezpośrednio interfejsować. RAM ' Maksymalny możliwy rozmiar jest określany przez rozmiar magistrali adresowej i nie jest to rozmiar magistrali danych ani nawet jednostki ALU, na której zdefiniowany jest rozmiar procesora (32/64 bity). Tak, jeśli procesor ma 32-bitową „magistralę adresową”, to jest w stanie zaadresować 2 ^ 32 bajty = 4 GB pamięci RAM (lub dla 64 bitów będzie to 2 ^ 64) ... ale mówiąc, że procesor 32-bitowy lub 64-bitowy ma nic nie ma znaczenia dla tej przestrzeni adresowej (przestrzeń adresowa = jak daleko może uzyskać dostęp do pamięci lub maksymalny rozmiar pamięci RAM) i zależy tylko od rozmiaru jej jednostki ALU. Oczywiście magistrala danych i magistrala adresowa mogą być tej samej wielkości i wtedy może się wydawać, że 32-bitowy procesor oznacza, że będzie miał dostęp do 2 ^ 32 bajtów lub 4 GB pamięci ... ale to tylko zbieg okoliczności i nie będzie to samo dla wszystkich.... na przykład intel 8086 jest 16-bitowym procesorem (ponieważ ma 16-bitową jednostkę ALU), więc jak mówisz, powinien mieć dostęp do 2 ^ 16 bajtów = 64 KB pamięci, ale to nieprawda. Może uzyskać dostęp do 1 MB pamięci, aby mieć 20-bitową magistralę adresową .... Możesz wygooglować, jeśli masz jakiekolwiek wątpliwości :)
Myślę, że wyjaśniłem swoje stanowisko teraz, przechodząc do twojego pytania ... ponieważ 64-bitowy procesor nie oznacza, że musi mieć 64-bitową magistralę adresową, więc nie ma nic złego w posiadaniu 48-bitowej magistrali adresowej w 64-bitowym procesorze ... zmniejszyli przestrzeń adresową, aby projekt i produkcja były tanie ... ponieważ nikt nie będzie używał tak dużej pamięci (2 ^ 64 bajty) ... gdzie 2 ^ 48 bajtów jest obecnie więcej niż wystarczające.
źródło
Nie jest prawdą, że używane są tylko 48 bitów niskiego rzędu 64-bitowego VA, przynajmniej w przypadku Intel 64. Górnych 16 bitów jest używanych, w pewnym sensie.
Sekcja 3.3.7.1 Adresowanie kanoniczne w podręczniku programisty architektury Intel® 64 i IA-32 mówi:
Zatem bity od 47 do 63 tworzą super-bit, albo wszystkie 1, albo wszystkie 0. Jeśli adres nie jest w formie kanonicznej, implementacja powinna spowodować błąd.
Na AArch64 jest inaczej. Według przeglądu zestawu instrukcji ARMv8 jest to 49-bitowy VA.
źródło
[vsyscall]
strona. (To może być eksportowanie rzeczy, takich jak bieżący PID, abygetpid()
był czysto przestrzenią użytkownika.gettimeofday()
Można też po prostu użyć rdtsc w przestrzeni użytkownika + współczynniki skali eksportowane przez jądro. Chociaż część z nich jest tak myślę[vdso]
, że jest blisko dolna połowa.)__VMALLOC_BASE
robi. Prawdopodobnie nie jest używany bezpośrednio.Procesor jest uważany za „N-bitowy” głównie ze względu na rozmiar jego magistrali danych i na dużą część jego jednostek (architektura wewnętrzna) : rejestry, akumulatory, jednostka arytmetyczno-logiczna (ALU), zestaw instrukcji itp. Na przykład: Dobry, stary procesor Motorola 6800 (lub Intel 8050) jest 8-bitowy. Ma 8-bitową magistralę danych, 8-bitową architekturę wewnętrzną i 16-bitową magistralę adresową.
źródło