Dlaczego systemy x86-64 mają tylko 48-bitową wirtualną przestrzeń adresową?

97

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?

er4z0r
źródło
11
Książka musiała mówić konkretnie o aktualnej implementacji architektury AMD64 (x86-64). Używane są tylko dolne 48 bitów. Nie jest to jednak ograniczenie sprzętowe - dostępne są wszystkie 64 bity.
Cody Grey
7
Zawsze dobrze jest zidentyfikować książkę.
Henk Holterman,
1
Domyślam się, że fizyczne linie adresowe nie są wolne (potrzebujesz przynajmniej 16 dodatkowych pinów procesora). I nie znam żadnego sprzętu, który mógłby wypełnić 48-bitową przestrzeń fizycznymi układami RAM na tym samym procesorze. Jestem pewien, że kiedy stanie się to wykonalne, AMD doda brakujące 16 pinów :)
Torp,
7
nawet, The 32-bit processors have 2^32 possible addressesniekoniecznie 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.
ShinTakezou,
21
Istnieje bardzo poważny problem z 64-bitowym adresowaniem fizycznym, rozmiar strony pamięci wirtualnej jest zbyt mały. Co powoduje ogromne katalogi stron i niezwykle kosztowne opróżnianie pamięci podręcznej TLB przy każdym przełączeniu kontekstu. Przejście z 4KB do 4MB stron jest opcją, ale bardzo niekompatybilne z obecnymi systemami operacyjnymi.
Hans Passant,

Odpowiedzi:

134

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.

jalf
źródło
118
640kb wystarczy dla każdego.
7
Nadal używasz systemu 8088, bdares?
Joe,
23
@bdares: Zła analogia. Zestaw instrukcji arch 8088/8086 ma wbudowany limit 640k. Dopiero wykonanie nowego ISA (386) umożliwiło przełamanie bariery. Z drugiej strony x86_64 obsługuje wszystkie 64 bity w ISA. To tylko sprzęt prąd generacji, które nie mogą korzystać z nich wszystkich ...
R .. GitHub przestali pomagać ICE
16
@R. W rzeczywistości ograniczenie procesora wynosiło jeden megabajt. IBM PC wyznaczył sekcję tej sekcji dla urządzeń peryferyjnych mapowanych w pamięci, BIOSu itp. Niektóre inne projekty 8088/8086 (Zenith Z100, jeśli pamięć służy) przeznaczono mniej dla urządzeń peryferyjnych i tym podobnych, a odpowiednio więcej dla programów użytkowych.
Jerry Coffin
25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- trzy lata po tej odpowiedzi już osiągamy te limity :) Maszyna HP będzie miała 320 TB pamięci i nie może zapewnić jej jako płaskiej przestrzeni adresowej z powodu 48 -bitowe ograniczenie adresowania.
agam
18

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 .. GitHub PRZESTAŃ POMÓC LODOWI
źródło
14
„Bycie tanim” Myślę, że masz na myśli nie dodawanie pinów, które nigdy nie będą używane, nie zajmowanie miejsca w chipie na tranzystory, które nie będą używane i wykorzystywanie zwolnionej przestrzeni do przyspieszenia istniejących instrukcji? Jeśli to jest tanie, jestem w!
Olof Forshell,
Model 80386 umożliwia wybór 2 * 4096 selektorów, z których każdy może zawierać do 4 GB pamięci (łącznie 32 TB). W modelu 80286 dozwolone są selektory 2 * 4096, każdy zawierający do 64 KB (1 GB).
Olof Forshell
Nieliniowe hacki podzielone na segmenty nie liczą się jako przestrzeń adresowa w mojej książce. Nie ma możliwości, aby oprogramowanie przenośne w jakikolwiek sposób z nich korzystało.
R .. GitHub PRZESTAŃ POMÓC NA LODZIE
@R .. - Myślałem, że przenośne oprogramowanie jest takie, że może . :-) Na przykład C ++ zabrania porównywania wskaźników do różnych tablic, aby mogły znajdować się w oddzielnych segmentach 4 GB.
Bo Persson,
Jeśli twoja kompilacja faktycznie generuje ogromne wskaźniki i ładuje rejestr segmentowy dla każdej dereferencji pamięci, to tak. Ale w rzeczywistości jest to strasznie powolne, a zamiast tego wszyscy używali małych modeli pamięci i __far(lub co gorsza, FAR/ far!) Wskaźników ...
R .. GitHub STOP HELPING ICE
10

Przeczytaj sekcję dotyczącą ograniczeń w artykule na Wikipedii :

Komputer nie może zawierać 4 petabajtów pamięci (ze względu na rozmiar obecnych układów pamięci, jeśli nic innego), ale AMD przewidziało duże serwery, klastry pamięci współdzielonej i inne zastosowania fizycznej przestrzeni adresowej, które mogą zbliżyć się do tego w dającej się przewidzieć przyszłości, a 52 bitowy adres fizyczny zapewnia dużo miejsca na rozbudowę bez ponoszenia kosztów implementacji 64-bitowych adresów fizycznych

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.

Damien_The_Unbeliever
źródło
Skąd pochodzi 4 w 4 petabajtach? Jeśli mówimy o 64 liniach adresowych, powinniśmy otrzymać kwadrat przestrzeni adresowej, która jest możliwa dzięki 32 liniom adresowym, czyli 4 gigabajty. Kwadrat to i powinniśmy mieć 16, a nie 4 petabajty. Czy coś mi brakuje?
Olof Forshell
1
Wynika to z obecnego fizycznego limitu (52 bity) - chodzi o to, że nie możemy umieścić wystarczającej ilości pamięci RAM w komputerze PC, aby obsłużyć ten ograniczony zakres, nie mówiąc już o tym, co byłoby wymagane dla pełnej 64-bitowej przestrzeni adresowej.
Damien_The_Unbeliever
9

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
1
ale 68000 jest traktowane jako "16/32 bitowy" procesor, a nie "pełny" 32-bitowy procesor, więc można by powiedzieć, że wciąż ma stopę w 16-bitowej przeszłości; Jako przykład wybrałem 68020, ponieważ jego tania wersja 68EC020 ma 24 bity tylko dla adresów, chociaż 68020 jest "pełnym" 32-bitowym procesorem ... +1, aby wziąć pod uwagę tę wspaniałą rodzinę procesorów!
ShinTakezou,
@ShinTakezou: szczerze, czy 80386SX był 16-bitowym procesorem (ponieważ miał przestrzeń adresową taką jak 80286), czy też 32-bitowym (ponieważ miał wewnętrzną architekturę 80386DX)? Ktoś mógłby powiedzieć tak jak ty, ale inny (ten) mówi, że „liczy się wewnętrzne” - i możesz mnie zacytować.
Olof Forshell
@Olof Myślę, że w kontekście "pamięci" (czyli świata zewnętrznego) liczy się zewnętrzna, więc 68000 to procesor 16-bitowy (wymagający 2 "kroków" do odczytu danych 32-bitowych): D
ShinTakezou
@ShinTakezou: kontekst pamięci, nawet pamięci podręczne, jest zawsze zewnętrzny w stosunku do samego procesora, mimo że są one niezwykle ściśle powiązane w nowoczesnych procesorach. 8088 był wewnętrznie równy 8086, chociaż miał osiem linii magistrali danych do szesnastu 8086. Nie widzę tego, co najwyraźniej uważasz za oczywiste, że 8088 należy sklasyfikować w tej samej grupie co Z80, 8080, 8085 itd. Kwestia szerokości szyny danych wydaje się w tym kontekście banalna
Olof Forshell
W ogóle nie jestem znawcą takiej sprawy, więc nie mam dla mnie nic oczywistego. Chciałem tylko zauważyć potrzebę ostrzejszego cięcia z przeszłością, gdzie można by pomyśleć, że 68000 to wciąż procesor „z dawnych czasów”, więc że może wydawać się „naturalne”, że jego przestrzeń adresowa jest ograniczona do mniej niż 32 bity, podczas gdy 68020 może 32 bity, więc istnienie 68EC020 z jego ograniczeniami jasno pokazuje, że jest to wybór nie ze względu na „ograniczenie tego ( lub ten) czas ”, ale z innego powodu (np. uczynienie go tańszym, jeśli nie ma realnej korzyści z posiadania 64 pinów), co jest mniej więcej argumentem tej odpowiedzi.
ShinTakezou
7

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ść.

Brendan
źródło
1
Intel proponuje 5-poziomowy schemat stronicowania, aby rozszerzyć się z obecnych 48 bitów do 57 bitów. (Te same 9 bitów na poziom / 4k stron jak bieżące tabele stron x86-64). Użycie 10 lub 11 bitów na poziom wymagałoby zmiany sprzętu do przeglądania stron, więc może to nie być optymalny projekt dla dużej pamięci, ale jest to rozsądne rozszerzenie dla procesora z dwoma trybami, który musi również obsługiwać maksymalną wydajność dla 4- tabele poziomów w aktualnym formacie.
Peter Cordes
Oczywiście w przypadku stron 2M lub 1G to tylko 4 lub 3 poziomy tabel stron od najwyższego poziomu do wpisu tabeli o dużej stronie zamiast wskaźnika do katalogu stron.
Peter Cordes
6

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.

linzuojian
źródło
4

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

Anand K Enamandram
źródło
To pytanie dotyczy 48-bitowego rozmiaru wirtualnej przestrzeni adresowej (wymaganie, aby adresy wirtualne były kanoniczne). Potrzebujesz więcej bitów wirtualnych niż bitów fizycznych, więc jądro o wyższej połowie może zamapować całą pamięć fizyczną na pojedynczą przestrzeń adresową (własną lub użytkownika). Jak powiedziałeś, HW musi zaimplementować tylko tyle bitów PA, ile mogą wykorzystać kontrolery DRAM + MMIO i może używać dowolnej liczby do 52-bitowego limitu w formacie tablicy stron x86-64. ( Dlaczego w 64-bitowym adresie wirtualnym są 4 bity krótkie (48-bitowe) w porównaniu z adresem fizycznym (52-bitowe)? )
Peter Cordes,
1
Czteropoziomowy format tablicy stron narzuca również 48-bitowy limit VA, aż HW + SW obsługuje tablice stron PML5 dla 57-bitowych VA. W każdym razie jest to przydatna odpowiedź, ale wydaje się, że została umieszczona pod niewłaściwym pytaniem. Nie jestem pewien, czy jest na to lepsze miejsce, więc myślę, że możemy to tutaj zostawić, mam nadzieję, że z edycją dodającą nagłówek, aby powiedzieć coś o PA kontra VA.
Peter Cordes,
2

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.

hafiz031
źródło
Myślę, że bardzo jasno przedstawiłeś swój punkt widzenia, jest jedna rzecz, której nie rozumiem w tym, co powiedziałeś o 16-bitowym procesorze 8086: w jaki sposób 16-bitowy procesor może obsłużyć 20-bitowy adres? Czy radzi sobie z tym w 2 etapach operacji? Nawet jeśli magistrala adresowa ma szerokość 20 bitów, po dotarciu do procesora szerokość rejestru może oczywiście zająć tylko 16 bitów ... Jak oni to robią?
programiści
2
Hmm ... 2-stopniowa operacja. Rejestr segmentowy zawiera tylko górne 16 bitów. Następnie jest mnożony przez 10 H, aby uzyskać 20 bitów, a następnie dodawany jest offset.
hafiz031
1

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:

adres kanoniczny musi mieć bity od 63 do 48 ustawione na zera lub jedynki (w zależności od tego, czy bit 47 to zero czy jedynka)

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.

System translacji pamięci AArch64 obsługuje 49-bitowy adres wirtualny (48 bitów na tablicę translacji). Adresy wirtualne są rozszerzane ze znaku z 49 bitów i przechowywane w 64-bitowym wskaźniku. Opcjonalnie, pod kontrolą rejestru systemowego, 8 najbardziej znaczących bitów 64-bitowego wskaźnika może zawierać „znacznik”, który zostanie zignorowany, gdy zostanie użyty jako adres ładowania / przechowywania lub cel pośredniej gałęzi

Olsonist
źródło
1
Tylko dolne 48 jest znaczące, ale sprzęt sprawdza, czy jest poprawnie rozszerzony do 64 bitów. IDK, dlaczego nie określili rozszerzenia zerowego; być może chcieli, aby wygodniej było sprawdzać górną i dolną połowę adresu (po prostu sprawdzając bit znaku). A może w celu uniknięcia szczególnego traktowania granicy 2 ^ 48 i dlatego adresy u góry mogą wygodnie zmieścić się w 32-bitowych stałych rozszerzonych ze znakiem. Myślę, że to drugie jest bardziej prawdopodobne.
Peter Cordes
W każdym razie, bieżące sprawdzanie sprzętu pod kątem kanonicznego zapobiega używaniu przez oprogramowanie ignorowanych bitów dla oznaczonych wskaźników, które będą łamać się w przyszłym sprzęcie, więc jest to część mechanizmu, który umożliwia rozszerzenie przyszłego sprzętu, jeśli / kiedy jest to potrzebne. (Co może nastąpić wcześniej, niż się spodziewali, dzięki nieulotnej pamięci podłączonej bezpośrednio do fizycznej i wirtualnej przestrzeni adresowej.)
Peter Cordes
procfs w systemie Linux na moim Core i5 mówi, że jest mapowany na 7ffd5ea41000-7ffd5ea62000. Ten zakres adresów ma sens zgodnie z powyższą zasadą „kanoniczną”. Bity 48-63 mają wartość 0, co czyni go poprawnym adresem kanonicznym. Trochę dziwne są adresy w źródłach Linuksa. W include / asm / pgtable_64_types jest napisane #define __VMALLOC_BASE _AC (0xff92000000000000, UL). To NIE jest adres kanoniczny. Taki adres zaczynałby się od 0xffff8. Nie wiem dlaczego.
Olsonist,
Tak, IIRC Linux wykorzystuje dolną połowę zakresu kanonicznego dla przestrzeni użytkownika i (głównie) wykorzystuje wyższą połowę do mapowania samego jądra. Ale część pamięci jądra jest eksportowana do przestrzeni użytkownika, podobnie jak [vsyscall]strona. (To może być eksportowanie rzeczy, takich jak bieżący PID, aby getpid()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.)
Peter Cordes
IDK, co __VMALLOC_BASErobi. Prawdopodobnie nie jest używany bezpośrednio.
Peter Cordes,
0

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ą.


  • Chociaż N-bitowy procesor może mieć pewne jednostki o rozmiarze innym niż N. Na przykład ulepszenia w 6809 w porównaniu z 6800 (oba są 8-bitowymi procesorami z 8-bitową magistralą danych). Wśród znaczących ulepszeń wprowadzonych w 6809 było zastosowanie dwóch 8-bitowych akumulatorów (A i B, które można połączyć w jeden 16-bitowy rejestr, D), dwóch 16-bitowych rejestrów indeksowych (X, Y) i dwóch 16-bitowe wskaźniki stosu.
Amit G.
źródło
Jest już odpowiedź na to pytanie na przykładzie Motorola 68000/68020. To pytanie dotyczy konkretnie x86-64, a nie starych 8/16-bitowych procesorów. W przypadku x86-64 jednym z głównych czynników jest to, że szersze adresy wirtualne wymagałyby głębszej tabeli stron, a ten czynnik nie istniał dla starych układów, o których mówisz.
Peter Cordes,
Szerokość magistrali danych nie musi odpowiadać szerokości rejestru lub ALU. Na przykład Pentium P5 ma 64-bitową magistralę danych (wyrównane 64-bitowe obciążenia / magazyny są gwarantowane jako atomowe), ale rejestry / jednostki ALU są tylko 32-bitowe (z wyjątkiem zintegrowanego FPU, aw późniejszym Pentium MMX SIMD ALUs.)
Peter Cordes,
OP pisze: „Spodziewałem się, że jeśli jest to procesor 64-bitowy, przestrzeń adresowa również powinna wynosić 2 ^ 64”. ........ Piszesz: „To pytanie dotyczy konkretnie x86-64, a nie starych 8/16-bitowych procesorów”. ........ Myślę, że przegapiłeś istotę pytania OP. Pytanie OP jest wynikiem błędnego założenia, że ​​64-bitowy procesor powinien mieć 64-bitową magistralę adresową. O ALU napisałem dużą część jej podmiotów; Nie wszyscy z nich.
Amit G.,
Przestań mnie spamować, publikując ponownie ten komentarz. Tak, oczywiście OP jest błędny z powodu, który opisujesz, ale zwróciłem uwagę, że Twoja odpowiedź wygląda na podobny błąd. Mówisz " i w konsekwencji duża część jego jednostek: rejestry i akumulatory, jednostka arytmetyczno-logiczna (ALU) ... ", co brzmi tak, jakbyś mówił, że te rzeczy pasują do szerokości szyny danych. Wyrażenie „duża część” oznacza, że ​​mówisz, które części, a nie, że tylko czasami jest to prawdą w przypadku tych części.
Peter Cordes,