x86 - x86

x86
Projektant Intel , AMD
Bity 16-bitowe , 32-bitowe i 64-bitowe
Wprowadzono 1978 (16-bitowy), 1985 (32-bitowy), 2003 (64-bitowy)
Projekt CISC
Rodzaj Rejestr-pamięć
Kodowanie Zmienna (1 do 15 bajtów)
Rozgałęzienia Kod stanu
Endianowość Mały
Rozmiar strony 8086i286 : brak
i386 , i486 : 4 KB stron
P5 Pentium : dodano 4 MB stron
(starsze wersje PAE : 4 KB→2 MB)
x86-64 : dodano 1 GB stron
Rozszerzenia x87 , IA-32 , x86-64 , MMX , 3DNow! , SSE , MCA , ACPI , SSE2 , NX bit , SSE3 , ssse3 , SSE4 , SSE4.2 , AES-NI , CLMUL , RDRAND , SHA , MPX , SME , SGX , XOP , F16C , ADX , BMI , FMA , AVX , AVX2 , AVX512 , VT-x , VT-d , AMD- V , AMD- Vi , TSX , ASF , TXT
otwarty Częściowo. W przypadku niektórych zaawansowanych funkcji x86 może wymagać licencji firmy Intel; x86-64 może wymagać dodatkowej licencji od AMD. Procesor 80486 jest na rynku od ponad 30 lat i dlatego nie może być przedmiotem zastrzeżeń patentowych. Podzbiór architektury x86 sprzed 586 jest zatem w pełni otwarty.
Rejestry
Ogólny cel
  • 16-bitowe: 6 półdedykowanych rejestrów, BP i SP nie są ogólnego przeznaczenia
  • 32-bit: 8 GPR, w tym EBP i ESP
  • 64-bitowy: 16 GPR, w tym RBP i RSP
zmiennoprzecinkowy
  • 16-bit: opcjonalnie oddzielna jednostka FPU x87
  • 32-bitowy: opcjonalnie oddzielna lub zintegrowana jednostka FPU x87 , zintegrowane jednostki SSE w nowszych procesorach
  • 64-bitowy: zintegrowane jednostki x87 i SSE2 , późniejsze implementacje rozszerzone na AVX2 i AVX512
Architektury x86 były oparte na układzie mikroprocesorowym Intel 8086, pierwotnie wydanym w 1978 roku.
Intel Core 2 Duo, przykład zgodnego z architekturą x86, 64-bitowego procesora wielordzeniowego
AMD Athlon (wczesna wersja), technicznie odmienna, ale w pełni kompatybilna implementacja x86

x86 to rodzina architektur zestawów instrukcji początkowo opracowana przez firmę Intel w oparciu o mikroprocesor Intel 8086 i jego wariant 8088 . 8086 został wprowadzony w 1978 roku jako w pełni 16-bitowe rozszerzenie 8-bitowego mikroprocesora Intel 8080 , z segmentacją pamięci jako rozwiązaniem adresowania większej ilości pamięci niż może być pokryta zwykłym 16-bitowym adresem. Termin „x86” powstał, ponieważ nazwy kilku następców procesora Intel 8086 kończą się na „86”, w tym procesory 80186 , 80286 , 80386 i 80486 .

Wiele dodatków i rozszerzeń zostało dodanych do zestawu instrukcji x86 na przestrzeni lat, prawie konsekwentnie z pełną kompatybilnością wsteczną . Architektura została zaimplementowana w procesorach Intel, Cyrix , AMD , VIA Technologies i wielu innych firm; istnieją również implementacje otwarte, takie jak platforma Zet SoC (obecnie nieaktywna). Niemniej jednak, tylko Intel, AMD, VIA Technologies i DM&P Electronics posiadają licencje na architekturę x86, a tylko dwie pierwsze z nich aktywnie produkują nowoczesne projekty 64-bitowe.

Termin ten nie jest synonimem kompatybilności IBM PC , ponieważ oznacza to mnogość innego sprzętu komputerowego ; systemy wbudowane i komputery ogólnego przeznaczenia wykorzystywały chipy x86 przed pojawieniem się rynku kompatybilnego z komputerami PC , a niektóre z nich przed debiutem IBM PC (1981).

Od 2021 r. większość sprzedawanych komputerów osobistych , laptopów i konsol do gier opiera się na architekturze x86, podczas gdy kategorie mobilne, takie jak smartfony czy tablety, są zdominowane przez ARM ; na najwyższym poziomie x86 nadal dominuje w segmentach stacji roboczych intensywnie korzystających z mocy obliczeniowej i przetwarzania w chmurze , podczas gdy najszybszy superkomputer jest oparty na architekturze ARM, a czwórka czołówki nie jest już oparta na architekturze x86.

Przegląd

W latach 80. i wczesnych 90., kiedy 8088 i 80286 były nadal w powszechnym użyciu, termin x86 zwykle oznaczał dowolny procesor zgodny z 8086. Dzisiaj jednak x86 zazwyczaj implikuje binarną kompatybilność również z 32-bitowym zestawem instrukcji 80386. Wynika to z faktu, że ten zestaw instrukcji stał się czymś w rodzaju najniższego wspólnego mianownika dla wielu nowoczesnych systemów operacyjnych i prawdopodobnie także dlatego, że termin stał się powszechny po wprowadzeniu 80386 w 1985 roku.

Kilka lat po wprowadzeniu 8086 i 8088, Intel dodał nieco złożoności do swojego schematu nazewnictwa i terminologii, ponieważ „iAPX” ambitnego, ale niefortunnego procesora Intel iAPX 432 został wypróbowany na bardziej udanej rodzinie układów 8086, zastosowany jako rodzaj prefiksu na poziomie systemu. 8086 systemu , w tym koprocesorów , takie jak 8087 i 8089 , a także prostszych wiórów systemu Intel specyficznych zostało niniejszym opisane jako iAPX 86 systemu . Były też terminy iRMX (dla systemów operacyjnych), iSBC (dla komputerów jednopłytkowych) i iSBX (dla płyt wielomodułowych opartych na architekturze 8086), wszystkie razem pod nagłówkiem Microsystem 80 . Jednak ten schemat nazewnictwa był dość tymczasowy i trwał kilka lat we wczesnych latach 80-tych.

Chociaż 8086 został opracowany głównie dla systemów wbudowanych i małych komputerów wielu lub jednego użytkownika, głównie jako odpowiedź na udany Zilog Z80 kompatybilny z 8080 , linia x86 wkrótce zyskała na funkcjach i mocy obliczeniowej. Obecnie x86 jest wszechobecny zarówno w stacjonarnych, jak i przenośnych komputerach osobistych, a także jest używany w komputerach klasy średniej , stacjach roboczych , serwerach i większości nowych klastrów superkomputerów z listy TOP500 . Duża ilość oprogramowania , w tym duża lista systemów operacyjnych x86, korzysta ze sprzętu opartego na architekturze x86.

Współczesna architektura x86 jest jednak stosunkowo rzadka w systemach wbudowanych , a małe aplikacje o niskim poborze mocy (używające maleńkich baterii) oraz tanie mikroprocesory, takie jak urządzenia gospodarstwa domowego i zabawki, nie mają znaczącej obecności na rynku x86. Proste 8- i 16-bitowych architektur oparte są tu powszechne, choć zgodny z x86 VIA C7 , VIA Nano , AMD „s Geode , Athlon Neo i Intel Atom są przykładami 32- i 64-bitowych wzorów stosowanych w niektórych stosunkowo niskiej segmenty energetyczne i niskokosztowe.

Podjęto kilka prób, w tym przez Intela, aby zakończyć dominację rynkową „nieeleganckiej” architektury x86 zaprojektowanej bezpośrednio z pierwszych prostych mikroprocesorów 8-bitowych. Przykładami tego są iAPX 432 (projekt pierwotnie nazwany Intel 8800 ), Intel 960 , Intel 860 i architektura Intel/Hewlett-Packard Itanium . Jednak ciągłe udoskonalanie mikroarchitektur x86 , produkcji obwodów i półprzewodników utrudniłoby zastąpienie x86 w wielu segmentach. 64-bitowe rozszerzenie procesora x86 firmy AMD (na które firma Intel w końcu zareagował zgodnym projektem) oraz skalowalność układów x86 w postaci nowoczesnych wielordzeniowych procesorów, podkreśla, że ​​x86 jest przykładem tego, jak ciągłe udoskonalanie ustalonych standardów branżowych może się oprzeć konkurencja z zupełnie nowych architektur.

Chronologia

Poniższa tabela zawiera listę modeli procesorów i serii modeli implementujących wariacje zestawu instrukcji x86 w porządku chronologicznym. Każdy element linii charakteryzuje się znacznie ulepszoną lub komercyjnie udaną konstrukcją mikroarchitektury procesora .

Chronologia procesorów x86
Pokolenie Wstęp Wybitne modele procesorów Przestrzeń adresowa Wybitne cechy
Liniowy Wirtualny Fizyczny
x86 1st 1978 Intel 8086 , Intel 8088 (1979) 16-bitowy Nie dotyczy 20-bitowy 16-bitowy ISA , IBM PC (8088), IBM PC/XT (8088)
1982 Intel 80186 , Intel 80188
NEC V20 /V30 (1983)
8086-2 ISA, wbudowany (80186/80188)
2. Intel 80286 i klony 30-bitowy 24-bitowy tryb chroniony , IBM PC/XT 286 , IBM PC/AT
3. ( IA-32 ) 1985 Intel 80386 , AMD Am386 (1991) 32-bitowy 46-bitowy 32-bitowy 32-bitowy ISA , stronicowanie, IBM PS/2
4. (potokowanie, pamięć podręczna) 1989 Intel 80486
Cyrix Cx486S , DLC (1992)
AMD Am486 (1993), Am5x86 (1995)
Pipelining , on-die x87 FPU (486DX), on-die cache
5.
( Superskalarny )
1993 Intel Pentium , Pentium MMX (1996) Superskalarna , 64-bitowa magistrala danych , szybszy FPU, MMX (Pentium MMX), APIC , SMP
1994 NexGen Nx586
AMD 5k86 / K5 (1996)
Mikroarchitektura dyskretna (translacja µ-op)
1995 Cyrix Cx5x86
Cyrix 6x86 /MX (1997)/ MII (1998)
dynamiczna egzekucja
6.
( PAE , tłumaczenie µ-op)
1995 Intel Pentium Pro 36-bitowy ( PAE ) μ-op tłumaczenia, instrukcje warunkowe poruszać, dynamiczne wykonanie , spekulacyjny wykonanie , 3-way x86 Superskalarna, Superskalarna FPU, PAE , on-chip pamięci podręcznej L2
1997 Intel Pentium II , Pentium III (1999)
Celeron (1998), Xeon (1998)
On-package (Pentium II) lub on-die (Celeron) L2 Cache, SSE (Pentium III), SLOT 1 , Socket 370 lub SLOT 2 (Xeon)
1997 AMD K6 / K6-2 (1998) / K6-III (1999) 32-bitowy 3D teraz! , 3-poziomowy system pamięci podręcznej (K6-III)
Ulepszona platforma 1999 AMD Athlon
Athlon XP / MP (2001)
Duron (2000)
Sempron (2004)
36-bitowy MMX+, 3DNow!+, magistrala z podwójną pompą, gniazdo A lub gniazdo A
2000 Transmeta Crusoe 32-bitowy Procesor platformy x86 zasilany przez CMS , rdzeń VLIW- 128, wbudowany kontroler pamięci, zintegrowana logika mostka PCI
Intel Pentium 4 36-bitowy SSE2 , HTT (Northwood), NetBurst, magistrala czteropompowa, pamięć podręczna śledzenia, gniazdo 478
2003 Intel Pentium M
Intel Core (2006)
Dwurdzeniowy Pentium (2007)
Fuzja µ-op , bit XD (Dothan) (Intel Core „Yonah”)
Transmeta Efficeon CMS 6.0.4, VLIW -256, bit NX , HT
IA-64 64-bitowe przejście
1999-2005
2001 Intel Itanium (2001-2017) 52-bitowy 64-bitowa architektura EPIC , 128-bitowy pakiet instrukcji VLIW, sprzętowy sprzęt IA-32 obsługujący systemy operacyjne x86 i aplikacje x86 (wczesne generacje), oprogramowanie IA-32 EL obsługujące aplikacje x86 (Itanium 2), pliki rejestrów Itanium są mapowane do rejestrów x86
x86-64 64-bit Rozszerzony
od 2001 r.
x86-64 to 64-bitowa rozszerzona architektura x86, jej tryb Legacy zachowuje całą i niezmienioną architekturę x86. Natywna architektura procesorów x86-64: rezydująca w trybie 64-bitowym, brak trybu dostępu w segmentacji, prezentująca 64-bitową liniową przestrzeń adresową z pozwoleniem architektonicznym; dostosowana architektura IA-32 znajdująca się w trybie zgodności wraz z trybem 64-bitowym zapewnia obsługę większości aplikacji x86
2003 Athlon 64 / FX / X2 (2005), Opteron
Sempron (2004)/ X2 (2008)
Turion 64 (2005)/ X2 (2006)
40-bitowy AMD64 (z wyjątkiem niektórych procesorów Sempron prezentowanych jako czysto procesorami x86), w-die kontroler pamięci HyperTransport , na matrycy dwurdzeniowych (2x), AMD-V (Athlon 64 Orleans), Socket 754 / 939 / 940 lub AM2
2004 Pentium 4 (Prescott)
Celeron D , Pentium D (2005)
36-bitowy EM64T (włączony w wybranych modelach Pentium 4 i Celeron D), SSE3 , 2. gen. NetBurst pipelining, dwurdzeniowy (on-die: Pentium D 8xx, on-chip: Pentium D 9xx), Intel VT (Pentium 4 6x2), gniazdo LGA 775
2006 Dwurdzeniowy procesor Intel Core 2
Pentium (2007)
Dwurdzeniowy procesor Celeron (2008)
Intel 64 (<<== EM64T), SSSE3 (65 nm), szeroka dynamiczna realizacja, fuzja µ-op, fuzja makrooperacji w trybie 16-bitowym i 32-bitowym, czterordzeniowy procesor (Core 2 Quad) , Inteligentna współdzielona pamięć podręczna L2 (Intel Core 2 „Merom”)
2007 AMD Phenom / II (2008)
Athlon II (2009)
Turion II (2009)
48-bitowy Monolityczny czterordzeniowy (X4)/trójrdzeniowy (X3), SSE4a , Rapid Virtualization Indexing (RVI), HyperTransport 3, AM2+ lub AM3
2008 Intel Core 2 (45 nm) 40-bitowy SSE4.1
Atom Intela netbook lub procesor do urządzeń inteligentnych o niskim poborze mocy, ponownie użyty rdzeń P54C
Intel Core i7
Core i5 (2009)
Core i3 (2010)
QuickPath, wbudowany GMCH ( Clarkdale ), SSE4.2 , rozszerzone tabele stron (EPT) do wirtualizacji, fuzja makrooperacji w trybie 64-bitowym, (Intel Xeon „Bloomfield” z mikroarchitekturą Nehalem)
VIA Nano szyfrowanie sprzętowe ; adaptacyjne zarządzanie energią
2010 AMD FX 48-bitowy ośmiordzeniowy, CMT (klastrowy wielowątkowy), FMA, OpenCL, AM3+
2011 AMD serii APU A i E ( Llano ) 40-bitowy wbudowany GPGPU, PCI Express 2.0, gniazdo FM1
AMD APU serii C, E i Z ( Bobcat ) 36-bitowy APU inteligentnego urządzenia o małej mocy
Intel Core i3 , Core i5 i Core i7
( Sandy Bridge / Ivy Bridge )
Połączenie pierścienia wewnętrznego, dekodowana pamięć podręczna µ-op, gniazdo LGA 1155
2012 AMD APU A Series ( buldożer, Trinity i nowsze) 48-bitowy AVX , APU oparty na buldożerach, Socket FM2 lub Socket FM2+
Intel Xeon Phi (Kącik Rycerzy) Dodatkowy koprocesor karty PCI-E dla systemu opartego na XEON, układ Manycore, in-order P54C , bardzo szeroki VPU (512-bit SSE), instrukcje LRBni (8×64-bit)
2013 AMD Jaguar
(Athlon, Sempron)
SoC , konsola do gier i procesor urządzenia inteligentnego o niskim poborze mocy
Intel Silvermont
(Atom, Celeron, Pentium)
36-bitowy SoC , procesor urządzenia inteligentnego o niskim/bardzo niskim poborze mocy
Intel Core i3 , Core i5 oraz Core i7 ( Haswell / Broadwell ) 39-bitowy Instrukcje AVX2 , FMA3 , TSX , BMI1 i BMI2 , gniazdo LGA 1150
2015 Intel Broadwell-U
( Intel Core i3 , Core i5 , Core i7 , Core M , Pentium , Celeron )
SoC, na chipie Broadwell-U PCH-LP (moduł wielochipowy)
2015-2020 Intel Skylake / Kaby Lake / Cannon Lake / Coffee Lake / Rocket Lake
(Intel Pentium / Celeron Gold, Core i3 , Core i5 , Core i7 , Core i9 )
46-bitowy AVX-512 (ograniczony do Cannon Lake-U i stacji roboczych/serwerowych wersji Skylake)
2016 Intel Xeon Phi (lądowanie rycerskie) 48-bitowy Wielordzeniowy procesor i koprocesor dla systemów Xeon, rdzeń oparty na Airmont (Atom)
2016 AMD Bristol Ridge
(AMD (Pro) A6/A8/A10/A12)
Zintegrowany FCH na matrycy, SoC, gniazdo AM4
2017 Seria AMD Ryzen/seria AMD Epyc Implementacja AMD SMT, wiele matryc na chipie
2017 Zhaoxin WuDaoKou (KX-5000, KH-20000) Pierwsza zupełnie nowa architektura x86-64 firmy Zhaoxin
2018-2021 Intel Sunny Cove (Ice Lake-U i Y), Cypress Cove (Rocket Lake) 57-bitowy Pierwsza implementacja AVX-512 firmy Intel dla segmentu konsumenckiego. Dodanie instrukcji wektorowej sieci neuronowej (VNNI)
2020 Intel Willow Cove (Jezioro Tygrysa-Y/U/H) Architektura połączeń dwupierścieniowych, zaktualizowany akcelerator neuronowy Gaussa (GNA2), nowe instrukcje przecięcia wektorów AVX-512, dodanie technologii Control-Flow Enforcement Technology (CET)
Era Uwolnienie Modele procesorów Fizyczna przestrzeń adresowa Nowe funkcje

Historia

Inni producenci

Am386 , wydany przez AMD w 1991 roku

W różnych okresach firmy takie jak IBM , VIA , NEC , AMD , TI , STM , Fujitsu , OKI , Siemens , Cyrix , Intersil , C&T , NexGen , UMC i DM&P rozpoczęły projektowanie lub produkcję procesorów x86 przeznaczonych do użytku osobistego. komputery i systemy wbudowane. Takie implementacje x86 rzadko są prostymi kopiami, ale często wykorzystują różne wewnętrzne mikroarchitektury i różne rozwiązania na poziomie elektronicznym i fizycznym. Zupełnie naturalnie, wczesne kompatybilne mikroprocesory były 16-bitowe, podczas gdy konstrukcje 32-bitowe zostały opracowane znacznie później. Na rynku komputerów osobistych prawdziwe ilości zaczęły pojawiać się około 1990 roku z procesorami kompatybilnymi z i386 i i486 , często nazywanymi podobnie do oryginalnych chipów Intela. Inne firmy, które zaprojektowały lub wyprodukowały procesory x86 lub x87 , to ITT Corporation , National Semiconductor , ULSI System Technology i Weitek .

Po w pełni potokowym i486 , Intel wprowadził markę Pentium (która, w przeciwieństwie do liczb, może być znakiem towarowym ) dla swojego nowego zestawu superskalarnych projektów x86. Gdy schemat nazewnictwa x86 został prawnie dopuszczony, inni dostawcy x86 musieli wybrać inne nazwy dla swoich produktów zgodnych z x86, a początkowo niektórzy zdecydowali się kontynuować różne odmiany schematu numeracji: IBM współpracował z Cyrix, aby wyprodukować 5x86, a następnie bardzo wydajny Linie 6x86 (M1) i 6x86 MX ( MII ) projektów Cyrix, które były pierwszymi mikroprocesorami x86, które implementowały zmianę nazwy rejestrów w celu umożliwienia wykonywania spekulatywnego . W międzyczasie AMD zaprojektowało i wyprodukowało zaawansowany, ale opóźniony 5k86 ( K5 ), który wewnętrznie był ściśle oparty na wcześniejszej konstrukcji AMD 29K RISC ; podobna do NexGen „s Nx586 , że użył takich strategii, które dedykowane etapy rurociągów dekodowania instrukcji x86 w jednolite i łatwo je opanować mikro-operacje , to metoda, która pozostaje podstawą dla większości wzorów x86 do dnia dzisiejszego.

Niektóre wczesne wersje tych mikroprocesorów miały problemy z rozpraszaniem ciepła. Na 6x86 wpłynęło również kilka drobnych problemów z kompatybilnością, Nx586 brakowało jednostki zmiennoprzecinkowej (FPU) i (wówczas kluczowej) kompatybilności pinów, podczas gdy K5 miał nieco rozczarowujące osiągi, gdy został (ostatecznie) wprowadzony. Niewiedza klientów na temat alternatyw dla serii Pentium dodatkowo przyczyniła się do tego, że te projekty były stosunkowo nieudane, pomimo faktu, że K5 miał bardzo dobrą kompatybilność z Pentium, a 6x86 był znacznie szybszy niż Pentium na kodzie całkowitym. AMD zdołało później wyrosnąć na poważnego rywala z zestawem procesorów K6 , który ustąpił miejsca bardzo udanym Athlonowi i Opteronowi . Byli też inni rywale, tacy jak Centaur Technology (dawniej IDT ), Rise Technology i Transmeta . Energooszczędne procesory C3 i C7 firmy VIA Technologies , które zostały zaprojektowane przez firmę Centaur , są sprzedawane od wielu lat. Najnowszy projekt Centaura, VIA Nano , to ich pierwszy procesor z superskalarną i spekulatywną realizacją . Został wprowadzony mniej więcej w tym samym czasie, co pierwszy procesor Intela „w kolejności” od czasu P5 Pentium , Intel Atom .

Rozszerzenia wielkości słowa

Zestaw instrukcji architektury dwukrotnie został przedłużony do większego wyrazu wielkości. W 1985 roku Intel wypuścił 32-bitowy 80386 (później znany jako i386), który w kolejnych latach stopniowo zastępował wcześniejsze 16-bitowe chipy w komputerach (chociaż zazwyczaj nie w systemach wbudowanych ); ten rozszerzony model programowania był pierwotnie określany jako architektura i386 (podobnie jak jego pierwsza implementacja), ale później Intel nazwał go IA-32 , wprowadzając swoją (niepowiązaną) architekturę IA-64 .

W latach 1999-2003 AMD rozszerzyło tę 32-bitową architekturę do 64 bitów i określało ją jako x86-64 we wczesnych dokumentach, a później jako AMD64 . Intel wkrótce przyjął rozszerzenia architektoniczne AMD pod nazwą IA-32e, później używał nazwy EM64T i wreszcie używał Intel 64. Microsoft i Sun Microsystems / Oracle również używają terminu „x64”, podczas gdy wiele dystrybucji Linuksa , a BSD również używa „amd64”. " semestr. Na przykład system Microsoft Windows oznacza swoje wersje 32-bitowe jako „x86”, a wersje 64-bitowe jako „x64”, podczas gdy pliki instalacyjne 64-bitowych wersji systemu Windows muszą być umieszczone w katalogu o nazwie „AMD64”.

Podstawowe właściwości architektury

Architektura x86 to zmienna długość instrukcji, głównie projekt " CISC " z naciskiem na kompatybilność wsteczną . Zestaw instrukcji nie jest jednak typowym CISC, ale zasadniczo rozszerzoną wersją prostych ośmiobitowych architektur 8008 i 8080 . Adresowanie bajtowe jest włączone, a słowa są przechowywane w pamięci w kolejności bajtów little-endian . Dostęp do pamięci do niewyrównanych adresów jest dozwolony dla prawie wszystkich instrukcji. Największy natywny rozmiar dla arytmetyki liczb całkowitych i adresów pamięci (lub przesunięć ) to 16, 32 lub 64 bity w zależności od generacji architektury (nowsze procesory obejmują również bezpośrednią obsługę mniejszych liczb całkowitych). Wiele wartości skalarnych może być obsługiwanych jednocześnie przez jednostkę SIMD obecną w późniejszych generacjach, jak opisano poniżej. Przesunięcia adresowania natychmiastowego i dane natychmiastowe mogą być wyrażone jako wielkości 8-bitowe dla często występujących przypadków lub kontekstów, w których zakres -128..127 jest wystarczający. Typowe instrukcje mają zatem długość 2 lub 3 bajty (chociaż niektóre są znacznie dłuższe, a niektóre są jednobajtowe).

Aby dodatkowo zaoszczędzić przestrzeń na kodowanie, większość rejestrów jest wyrażona w kodach operacji przy użyciu trzech lub czterech bitów, przy czym te ostatnie za pomocą prefiksu kodu operacji w trybie 64-bitowym, podczas gdy co najwyżej jeden operand instrukcji może być lokalizacją w pamięci. Jednak ten operand pamięci może być również miejscem docelowym (lub połączonym źródłem i miejscem docelowym), podczas gdy drugi operand, source , może być albo register lub direct . Między innymi przyczynia się to do rozmiaru kodu, który konkuruje z maszynami ośmiobitowymi i umożliwia efektywne wykorzystanie pamięci podręcznej instrukcji. Stosunkowo mała liczba rejestrów ogólnych (również odziedziczonych po 8-bitowych przodkach) sprawiła, że ​​adresowanie względem rejestrów (przy użyciu małych bezpośrednich przesunięć) jest ważną metodą dostępu do operandów, zwłaszcza na stosie. Dlatego zainwestowano wiele pracy w uczynienie takich dostępów tak szybkimi jak dostępy do rejestrów — tj. jednocyklowa przepustowość instrukcji, w większości przypadków, w których dostępne dane są dostępne w pamięci podręcznej najwyższego poziomu.

zmiennoprzecinkowa i SIMD

Dedykowany procesor zmiennoprzecinkowy z 80-bitowymi rejestrami wewnętrznymi, 8087 , został opracowany dla oryginalnego 8086 . Ten mikroprocesor został następnie rozwinięty w rozszerzony 80387 , a późniejsze procesory zawierały wstecznie kompatybilną wersję tej funkcji na tym samym mikroprocesorze co procesor główny. Oprócz tego, nowoczesne projekty x86 zawierają również jednostkę SIMD (patrz SSE poniżej), w której instrukcje mogą działać równolegle na (jednym lub dwóch) 128-bitowych słowach, z których każde zawiera dwie lub cztery liczby zmiennoprzecinkowe (każda 64 lub 32 szerokość odpowiednio bitów) lub alternatywnie 2, 4, 8 lub 16 liczb całkowitych (każda odpowiednio o szerokości 64, 32, 16 lub 8 bitów).

Obecność szerokich rejestrów SIMD oznacza, że ​​istniejące procesory x86 mogą ładować lub przechowywać do 128 bitów danych pamięci w jednej instrukcji, a także wykonywać równolegle operacje bitowe (choć nie arytmetyczne na liczbach całkowitych) na pełnych 128-bitowych ilościach. Procesory Sandy Bridge firmy Intel dodały instrukcje Advanced Vector Extensions (AVX), rozszerzając rejestry SIMD do 256 bitów. Instrukcje Intel Initial Many Core zaimplementowane przez procesory Knights Corner Xeon Phi oraz instrukcje AVX-512 zaimplementowane przez procesory Knights Landing Xeon Phi i procesory Skylake-X wykorzystują 512-bitowe rejestry SIMD.

Aktualne wdrożenia

Podczas wykonywania obecne procesory x86 wykorzystują kilka dodatkowych kroków dekodowania, aby podzielić większość instrukcji na mniejsze części zwane mikrooperacjami. Są one następnie przekazywane do jednostki sterującej, która buforuje i planuje je zgodnie z semantyką x86, aby mogły być wykonywane częściowo równolegle przez jedną z kilku (mniej lub bardziej wyspecjalizowanych) jednostek wykonawczych . Te nowoczesne wzory x86 są zatem potokowych , Superskalarna , a także zdolny poza kolejnością i wykonanie spekulacyjnego (poprzez przewidywania rozgałęzień , przemianowanie rejestrów i przewidywania zależność pamięci ), co oznacza, mogą one wykonywać wiele (częściowej lub całkowitej) instrukcje x86 jednocześnie, a niekoniecznie w tej samej kolejności, w jakiej podano w strumieniu instrukcji. Niektóre procesory Intela ( Xeon Foster MP , niektóre Pentium 4 i niektóre Nehalem, a później Intel Core ) oraz procesory AMD (począwszy od Zen ) są również zdolne do jednoczesnego wielowątkowości z dwoma wątkami na rdzeń ( Xeon Phi ma cztery wątki na rdzeń). Niektóre procesory Intel obsługują pamięć transakcyjną ( TSX ).

Po wprowadzeniu w połowie lat 90. metoda ta była czasami określana jako „rdzeń RISC” lub „translacja RISC”, częściowo ze względów marketingowych, ale także dlatego, że te mikrooperacje mają pewne wspólne właściwości z niektórymi typami instrukcji RISC. Jednak tradycyjny mikrokod (używany od lat pięćdziesiątych) z natury ma wiele takich samych właściwości; nowa metoda różni się głównie tym, że translacja na mikrooperacje odbywa się teraz asynchronicznie. Brak konieczności synchronizowania jednostek wykonawczych z krokami dekodowania otwiera możliwości większej analizy (buforowanego) strumienia kodu, a zatem umożliwia wykrywanie operacji, które mogą być wykonywane równolegle, jednocześnie zasilając więcej niż jedną jednostkę wykonawczą.

W razie potrzeby najnowsze procesory również robią coś przeciwnego; łączą pewne sekwencje x86 (takie jak porównanie, po którym następuje skok warunkowy) w bardziej złożoną mikrooperację, która lepiej pasuje do modelu wykonania, a zatem może być wykonywana szybciej lub przy mniejszych zaangażowaniu zasobów maszyny.

Innym sposobem na poprawę wydajności jest buforowanie zdekodowanych mikrooperacji, aby procesor mógł bezpośrednio uzyskać dostęp do zdekodowanych mikrooperacji ze specjalnej pamięci podręcznej, zamiast dekodować je ponownie. Intel zastosował to podejście, wprowadzając funkcję Execution Trace Cache w swojej mikroarchitekturze NetBurst (dla procesorów Pentium 4), a później w buforze Decoded Stream (dla procesorów Core od czasu Sandy Bridge).

Transmeta zastosowała zupełnie inną metodę w swoich procesorach kompatybilnych z Crusoe x86. Wykorzystali translację just-in-time, aby przekonwertować instrukcje x86 na natywny zestaw instrukcji VLIW procesora . Transmeta argumentowała, że ​​ich podejście pozwala na bardziej energooszczędne projekty, ponieważ procesor może zrezygnować ze skomplikowanego kroku dekodowania bardziej tradycyjnych implementacji x86.

Segmentacja

Minikomputery pod koniec lat 70. przekraczały 16-bitowy limit adresów 64 KB , ponieważ pamięć stała się tańsza. Niektóre minikomputery, takie jak PDP-11, wykorzystywały złożone schematy przełączania banków lub, w przypadku VAX firmy Digital , przeprojektowały znacznie droższe procesory, które mogły bezpośrednio obsługiwać 32-bitowe adresowanie i dane. Oryginalny 8086, opracowany z prostego mikroprocesora 8080 i skierowany głównie do bardzo małych i niedrogich komputerów i innych wyspecjalizowanych urządzeń, zamiast tego przyjął proste rejestry segmentowe, które zwiększały szerokość adresu pamięci tylko o 4 bity. Mnożąc adres 64 KB przez 16, adres 20-bitowy może zaadresować łącznie jeden megabajt (1048 576 bajtów), co w tamtym czasie było dość dużą ilością dla małego komputera. Koncepcja rejestrów segmentowych nie była nowa dla wielu komputerów mainframe, które używały rejestrów segmentowych do szybkiego przełączania się do różnych zadań. W praktyce na x86 była to (jest) bardzo krytykowana implementacja, która bardzo skomplikowała wiele typowych zadań programistycznych i kompilatorów. Jednak architektura wkrótce umożliwiła liniowe 32-bitowe adresowanie (począwszy od 80386 pod koniec 1985 r.), ale głównym aktorom (takim jak Microsoft ) zajęło kilka lat przekształcenie ich 16-bitowych systemów. 80386 (i 80486) był zatem przez wiele lat w dużej mierze używany jako szybki (ale wciąż 16-bitowy) 8086.

Dane i kod mogą być zarządzane w „bliskich” 16-bitowych segmentach w częściach 64 KB całkowitej przestrzeni adresowej 1  MB lub kompilator może działać w trybie „dalekim” przy użyciu segment:offsetpar 32-bitowych osiągających (tylko) 1 MB. Chociaż w połowie lat 80. okazało się to dość ograniczające, działało to na wschodzącym rynku komputerów PC i bardzo ułatwiało tłumaczenie oprogramowania ze starszych 8008 , 8080 , 8085 i Z80 na nowszy procesor. W roku 1985 16-bitowy model adresowania segmentów został skutecznie wyeliminowany przez wprowadzenie 32-bitowych rejestrów przesunięcia w projekcie 386 .

W trybie rzeczywistym segmentację uzyskuje się przez przesunięcie adresu segmentu w lewo o 4 bity i dodanie przesunięcia w celu otrzymania końcowego adresu 20-bitowego. Na przykład, jeśli DS to A000h, a SI to 5677h, DS:SI wskaże adres bezwzględny DS × 10h + SI = A5677h. Tak więc całkowita przestrzeń adresowa w trybie rzeczywistym wynosi 2 20 bajtów, czyli 1 MB , co jest dość imponującą liczbą w roku 1978. Wszystkie adresy pamięci składają się zarówno z segmentu, jak i przesunięcia; każdy typ dostępu (kod, dane lub stos) ma powiązany z nim domyślny rejestr segmentowy (dla danych rejestr to zwykle DS, dla kodu jest to CS, a dla stosu jest to SS). W przypadku dostępu do danych, rejestr segmentowy może być jawnie określony (za pomocą prefiksu przesłonięcia segmentu), aby użyć dowolnego z czterech rejestrów segmentowych.

W tym schemacie dwie różne pary segment/przesunięcie mogą wskazywać na pojedynczą lokalizację bezwzględną. Tak więc, jeśli DS to A111h, a SI to 4567h, DS:SI wskaże to samo A5677h, co powyżej. Ten schemat uniemożliwia jednoczesne użycie więcej niż czterech segmentów. CS i SS mają kluczowe znaczenie dla prawidłowego działania programu, dlatego tylko DS i ES mogą być używane do wskazywania segmentów danych poza programem (a dokładniej poza aktualnie wykonywanym segmentem programu) lub stosem.

W trybie chronionym , wprowadzonym w 80286, rejestr segmentowy nie zawiera już fizycznego adresu początku segmentu, ale zawiera „selektor”, który wskazuje na strukturę na poziomie systemu zwaną deskryptorem segmentu . Deskryptor segmentu zawiera fizyczny adres początku segmentu, długość segmentu oraz prawa dostępu do tego segmentu. Przesunięcie jest porównywane z długością segmentu, przy czym przesunięcia odnoszą się do lokalizacji poza segmentem, powodując wyjątek. Przesunięcia odnoszące się do lokalizacji wewnątrz segmentu są łączone z adresem fizycznym początku segmentu, aby uzyskać adres fizyczny odpowiadający temu przesunięciu.

Segmentowy charakter może utrudnić programowanie i projektowanie kompilatora, ponieważ użycie bliskich i dalekich wskaźników wpływa na wydajność.

Tryby adresowania

Tryby adresowania dla 16-bitowych trybów procesora można podsumować wzorem:

Tryby adresowania dla 32-bitowych trybów procesora x86 można podsumować wzorem:

Tryby adresowania dla trybu procesora 64-bitowego można podsumować wzorem:

Adresowanie względne instrukcji w kodzie 64-bitowym (RIP + przemieszczenie, gdzie RIP jest rejestrem wskaźnika instrukcji ) upraszcza implementację kodu niezależnego od pozycji (używanego w bibliotekach współdzielonych w niektórych systemach operacyjnych).

8086 miał 64 KB ośmiobitowego (lub alternatywnie32 K słowo 16-bitowe ) I / O przestrzeń iStos 64 KB (jeden segment) w pamięci obsługiwanej przez sprzęt komputerowy . Na stos można włożyć tylko słowa (dwa bajty). Stos rośnie w kierunku mniejszych liczbowo adresów, przy czym SS:SP wskazuje na ostatnio wypchnięty element. Istnieje 256 przerwań , które mogą być wywołane zarówno przez sprzęt, jak i oprogramowanie. Przerwania mogą być kaskadowe, używając stosu do przechowywania adresu zwrotnego .

rejestry x86

16-bitowy

Oryginalne procesory Intel 8086 i 8088 mają czternaście 16- bitowych rejestrów. Cztery z nich (AX, BX, CX, DX) to rejestry ogólnego przeznaczenia (GPR), chociaż każdy z nich może mieć dodatkowe przeznaczenie; na przykład tylko CX może być użyty jako licznik z instrukcją pętli . Każdy z nich może być dostępny jako dwa oddzielne bajty (w ten sposób starszy bajt BX może być dostępny jako BH, a młodszy jako BL). Dwa rejestry wskaźnikowe pełnią specjalne role: SP (wskaźnik stosu) wskazuje na „szczyt” stosu , a BP (wskaźnik bazowy) jest często używany do wskazywania innego miejsca na stosie, zwykle nad zmiennymi lokalnymi (patrz wskaźnik ramki ). Rejestry SI, DI, BX i BP są rejestrami adresowymi i mogą być również wykorzystywane do indeksowania tablicy.

Do utworzenia adresu pamięci wykorzystywane są cztery rejestry segmentowe (CS, DS, SS i ES). Rejestr FLAGI zawiera flagi , takie jak flagi carry , flagi przepełnienia i flaga zero . Wreszcie wskaźnik instrukcji (IP) wskazuje następną instrukcję, która zostanie pobrana z pamięci, a następnie wykonana; ten rejestr nie może być bezpośrednio dostępny (odczyt lub zapis) przez program.

Przez Intel 80186 i 80188 są zasadniczo ulepszony procesor 8086 lub 8088 odpowiednio z urządzeniami peryferyjnymi na chipie dodano, i mają takie same, jak rejestry CPU 8086 i 8088 (w dodatku do rejestrów interfejsu dla urządzeń peryferyjnych).

8086, 8088, 80186 i 80188 mogą używać opcjonalnego koprocesora zmiennoprzecinkowego 8087 . 8087 pojawia się programiście jako część procesora i dodaje osiem 80-bitowych rejestrów, od st(0) do st(7), z których każdy może przechowywać dane numeryczne w jednym z siedmiu formatów: 32-, 64- lub 80-bitowa liczba zmiennoprzecinkowa, 16-, 32- lub 64-bitowa (binarna) liczba całkowita i 80-bitowa spakowana liczba dziesiętna. Ma również swój własny 16-bitowy rejestr stanu dostępny za pośrednictwem instrukcji fntsw i często po prostu używa się niektórych jego bitów do rozgałęzienia, kopiując go do normalnych FLAGS.

W procesorze Intel 80286 , aby obsługiwać tryb chroniony , trzy specjalne rejestry przechowują adresy tablic deskryptorów (GDTR, LDTR, IDTR ), a czwarty rejestr zadań (TR) jest używany do przełączania zadań. 80287 jest koprocesor zmiennoprzecinkowy dla 80286 i posiada te same rejestry jak 8087 z tych samych formatów danych.

32-bitowy

Rejestry dostępne w zestawie instrukcji x86-64

Wraz z pojawieniem się 32-bitowego procesora 80386 , 16-bitowe rejestry ogólnego przeznaczenia, rejestry bazowe, rejestry indeksowe, wskaźnik instrukcji i rejestr FLAGS , ale nie rejestry segmentowe, zostały rozszerzone do 32 bitów. Nomenklatura reprezentowała to przez przedrostek " E " (dla "rozszerzony") do nazw rejestrów w asemblerze x86 . Tak więc rejestr AX odpowiada najniższym 16 bitom nowego 32-bitowego rejestru EAX, SI odpowiada najniższym 16 bitom ESI i tak dalej. Rejestry ogólnego przeznaczenia, rejestry podstawowe i rejestry indeksowe mogą być używane jako podstawa w trybach adresowania, a wszystkie te rejestry z wyjątkiem wskaźnika stosu mogą być używane jako indeks w trybach adresowania.

Dodano dwa nowe rejestry segmentowe (FS i GS). Przy większej liczbie rejestrów, instrukcji i operandów rozszerzono format kodu maszynowego . Aby zapewnić kompatybilność wsteczną, segmenty z kodem wykonywalnym można oznaczyć jako zawierające instrukcje 16-bitowe lub 32-bitowe. Specjalne prefiksy umożliwiają włączenie 32-bitowych instrukcji do 16-bitowego segmentu lub odwrotnie .

80386 miał opcjonalny koprocesor zmiennoprzecinkowy , 80387 ; miał osiem 80-bitowych rejestrów: st(0) do st(7), podobnie jak 8087 i 80287. 80386 może również używać koprocesora 80287. W 80486 i wszystkich kolejnych modelach x86, jednostka przetwarzania zmiennoprzecinkowego (FPU) jest zintegrowana w chipie.

Pentium MMX dodano osiem 64-bitową liczbę całkowitą MMX rejestrów (MMX0 do MMX7, które dzielą dolną bity z 80-bitowej szerokości FPU stosu). Wraz z Pentium III Intel dodał 32-bitowy rejestr kontrolny/stanu (MXCSR) Streaming SIMD Extensions (SSE) oraz osiem 128-bitowych rejestrów zmiennoprzecinkowych SSE (od XMM0 do XMM7).

64-bitowy

Począwszy od procesora AMD Opteron , architektura x86 rozszerzyła rejestry 32-bitowe na rejestry 64-bitowe w sposób podobny do tego, w jaki miało miejsce rozszerzenie 16 do 32-bitów. R -prefix (dla "register") oznacza rejestrów 64-bitowych (rax, RBX, RCX, RDX, RSI, RDI, RBP RSP RFLAGS RIP) i osiem dodatkowych 64-bitowych rejestrów ogólnego (R8-R15 ) zostały również wprowadzone przy tworzeniu x86-64 . Jednak tych rozszerzeń można używać tylko w trybie 64-bitowym, który jest jednym z dwóch trybów dostępnych tylko w trybie długim . Tryby adresowania nie zostały radykalnie zmienione z trybu 32-bitowego, z wyjątkiem tego, że adresowanie zostało rozszerzone do 64 bitów, adresy wirtualne mają teraz znak rozszerzony do 64 bitów (w celu uniemożliwienia bitów trybu w adresach wirtualnych), a inne szczegóły selektora zostały znacznie zmniejszone . Ponadto dodano tryb adresowania, aby umożliwić odwoływanie się do pamięci względem protokołu RIP ( wskaźnik instrukcji ), aby ułatwić implementację kodu niezależnego od pozycji , używanego w bibliotekach współdzielonych w niektórych systemach operacyjnych.

128-bitowy

SIMD rejestruje XMM0–XMM15.

256-bitowy

SIMD rejestruje YMM0–YMM15.

512-bitowy

Rejestry SIMD ZMM0–ZMM31.

Różne/specjalne przeznaczenie

Procesory x86, które mają tryb chroniony , tj. procesory 80286 i nowsze, mają również trzy rejestry deskryptorów (GDTR, LDTR, IDTR ) i rejestr zadań (TR).

32-bitowe procesory x86 (począwszy od 80386) zawierają również różne specjalne/różne rejestry, takie jak rejestry kontrolne (CR0 do 4, CR8 tylko dla 64-bitów), rejestry debugowania (DR0 do 3, plus 6 i 7), rejestry testowe (tylko od TR3 do 7; 80486) oraz rejestry specyficzne dla modelu (MSR, pojawiające się z Pentium).

AVX-512 ma osiem dodatkowych 64-bitowych rejestrów masek do wybierania elementów w ZMM.

Cel, powód

Chociaż rejestry główne (z wyjątkiem wskaźnika instrukcji) są „ogólnego przeznaczenia” w 32-bitowych i 64-bitowych wersjach zestawu instrukcji i mogą być używane do wszystkiego, pierwotnie przewidywano, że będą używane do następujące cele:

  • AL/AH/AX/EAX/RAX: Akumulator
  • BL/BH/BX/EBX/RBX: Indeks bazowy (do użytku z tablicami)
  • CL/CH/CX/ECX/RCX: Licznik (do użytku z pętlami i ciągami)
  • DL/DH/DX/EDX/RDX: Rozszerz precyzję akumulatora (np. połącz 32-bitowy EAX i EDX dla 64-bitowych operacji na liczbach całkowitych w 32-bitowym kodzie)
  • SI/ESI/RSI: Indeks źródłowy dla operacji na ciągach .
  • DI/EDI/RDI: Indeks docelowy dla operacji na ciągach.
  • SP/ESP/RSP: Wskaźnik stosu dla górnego adresu stosu.
  • BP/EBP/RBP: Wskaźnik bazowy stosu do przechowywania adresu bieżącej ramki stosu .
  • IP/EIP/RIP: Wskaźnik instrukcji. Przechowuje licznik programu , adres następnej instrukcji.

Rejestry segmentowe:

  • CS: Kod
  • DS: dane
  • SS: stos
  • ES: dodatkowe dane
  • FS: Dodatkowe dane #2
  • GS: Dodatkowe dane #3

Dla pozostałych 8 rejestrów dostępnych tylko w trybie 64-bitowym nie przewidziano żadnych szczególnych celów.

Niektóre instrukcje kompilują się i wykonują wydajniej podczas używania tych rejestrów zgodnie z ich przeznaczeniem. Na przykład, użycie AL jako akumulatora i dodanie do niego bezpośredniej wartości bajtu daje wydajny kod operacji dodawania do AL równy 04h, podczas gdy użycie rejestru BL daje ogólny i dłuższy kod operacji dodawania do rejestru 80C3h. Innym przykładem jest dzielenie i mnożenie o podwójnej precyzji, które działa w szczególności z rejestrami AX i DX.

Nowoczesne kompilatory skorzystały na wprowadzeniu bajtu sib ( scale-index-base byte ), który pozwala na jednolite traktowanie rejestrów ( podobnie do minikomputera ). Jednak uniwersalne użycie bajtu sib nie jest optymalne, ponieważ daje dłuższe kodowanie niż tylko selektywne używanie go, gdy jest to konieczne. (Główną zaletą bajtu sib jest ortogonalność i wydajniejsze tryby adresowania, które zapewnia, co umożliwia zapisywanie instrukcji i wykorzystanie rejestrów do obliczeń adresu, takich jak skalowanie indeksu). Niektóre specjalne instrukcje straciły priorytet w projektowaniu sprzętu i stał się wolniejszy niż równoważne małe sekwencje kodu. Godnym uwagi przykładem jest instrukcja LODSW.

Struktura

Rejestry ogólnego przeznaczenia (A, B, C i D)
64 56 48 40 32 24 16 8
R?X
BYŁY
?X
?H ?L?
Rejestry ogólnego przeznaczenia tylko w trybie 64-bitowym (R8, R9, R10, R11, R12, R13, R14, R15)
64 56 48 40 32 24 16 8
?
?D
?W?
?B
Rejestry segmentowe (C, D, S, E, F i G)
16 8
?S
Rejestry wskaźników (S i B)
64 56 48 40 32 24 16 8
R?P
E?P?
?P
?PL?

Uwaga: Rejestry ?PL są dostępne tylko w trybie 64-bitowym.

Rejestry indeksowe (S i D)
64 56 48 40 32 24 16 8
R?I
E?I?
?I
?IL?

Uwaga: Rejestry ?IL są dostępne tylko w trybie 64-bitowym.

Rejestr wskaźnika instrukcji (I)
64 56 48 40 32 24 16 8
ROZERWAĆ
EIP
IP

Tryby pracy

Tryb rzeczywisty

Tryb adresu rzeczywistego, powszechnie nazywany trybem rzeczywistym, jest trybem działania procesorów zgodnych z procesorami 8086 i nowszymi . Tryb rzeczywisty charakteryzuje się 20-bitową segmentowaną przestrzenią adresową pamięci (co oznacza, że można zaadresować tylko nieco więcej niż 1 MiB pamięci), bezpośrednim dostępem programowym do sprzętu peryferyjnego i brakiem koncepcji ochrony pamięci lub wielozadaniowości na poziomie sprzętowym. Wszystkie procesory x86 z serii 80286 i później uruchamiają się w trybie rzeczywistym po włączeniu zasilania; Procesory 80186 i wcześniejsze miały tylko jeden tryb operacyjny, który jest odpowiednikiem trybu rzeczywistego w późniejszych układach. (Na platformie IBM PC bezpośredni dostęp programowy do procedur IBM BIOS jest dostępny tylko w trybie rzeczywistym, ponieważ BIOS jest napisany dla trybu rzeczywistego. Jednak nie jest to właściwość procesora x86, ale projekt IBM BIOS).

Aby wykorzystać więcej niż 64 KB pamięci, należy użyć rejestrów segmentowych. Stworzyło to wielkie komplikacje dla implementatorów kompilatora, którzy wprowadzili dziwne tryby wskaźników, takie jak „blisko”, „daleko” i „wielki”, aby w różnym stopniu wykorzystać niejawną naturę architektury segmentowej, przy czym niektóre wskaźniki zawierają 16-bitowe przesunięcia w domniemanych segmentach i inne wskaźniki zawierające adresy segmentów i przesunięcia w segmentach. Technicznie możliwe jest użycie do 256 KB pamięci na kod i dane, do 64 KB na kod, ustawiając wszystkie cztery rejestry segmentowe raz, a następnie używając tylko 16-bitowych offsetów (opcjonalnie z domyślnymi prefiksami zastępowania segmentów) na adresować pamięć, ale nakłada to znaczne ograniczenia na sposób adresowania danych i łączenia operandów pamięci, a to narusza intencję architektoniczną projektantów Intela, która polega na tym, aby oddzielne elementy danych (np. tablice, struktury, jednostki kodu) były zawarte w oddzielnych segmentach i adresowane własnymi adresami segmentów, w nowych programach, które nie są przeniesione z wcześniejszych 8-bitowych procesorów z 16-bitowymi przestrzeniami adresowymi.

Tryb nierzeczywisty

Tryb Unreal jest używany przez niektóre 16-bitowe systemy operacyjne i niektóre 32-bitowe programy ładujące .

Tryb zarządzania systemem

Tryb zarządzania systemem (SMM) jest używany tylko przez oprogramowanie układowe systemu ( BIOS / UEFI ), a nie przez systemy operacyjne i aplikacje. Kod SMM działa w SMRAM.

Tryb obronny

Oprócz trybu rzeczywistego, Intel 80286 obsługuje tryb chroniony, rozszerzając adresowalną pamięć fizyczną do 16 MB i adresowalną pamięć wirtualną do 1  GB oraz zapewniając pamięć chronioną , która zapobiega wzajemnemu uszkadzaniu się programów. Odbywa się to za pomocą rejestrów segmentowych tylko do przechowywania indeksu w tablicy deskryptorów, która jest przechowywana w pamięci. Istnieją dwie takie tabele, Global Descriptor Table (GDT) i Local Descriptor Table (LDT), z których każda zawiera do 8192 deskryptorów segmentów, a każdy segment daje dostęp do 64 KB pamięci. W 80286 deskryptor segmentu zapewnia 24-bitowy adres bazowy , a ten adres bazowy jest dodawany do 16-bitowego przesunięcia w celu utworzenia adresu bezwzględnego. Adres bazowy z tabeli spełnia tę samą rolę, jaką w trybie rzeczywistym spełnia dosłowna wartość rejestru segmentowego; rejestry segmentowe zostały przekształcone z rejestrów bezpośrednich na rejestry pośrednie. Każdemu segmentowi można przypisać jeden z czterech poziomów pierścienia używanych do sprzętowego zabezpieczenia komputerów . Każdy deskryptor segmentu zawiera również pole limitu segmentu, które określa maksymalne przesunięcie, które może być użyte z segmentem. Ponieważ przesunięcia mają 16 bitów, segmenty są nadal ograniczone do 64 KB każdy w trybie chronionym 80286.

Za każdym razem, gdy rejestr segmentowy jest ładowany w trybie chronionym, 80286 musi odczytać 6-bajtowy deskryptor segmentu z pamięci do zestawu ukrytych rejestrów wewnętrznych. W związku z tym ładowanie rejestrów segmentowych jest znacznie wolniejsze w trybie chronionym niż w trybie rzeczywistym i należy unikać bardzo częstej zmiany segmentów. Rzeczywiste operacje pamięci przy użyciu segmentów w trybie chronionym nie są zbytnio spowalniane, ponieważ 80286 i późniejsze mają sprzęt do sprawdzania przesunięcia względem limitu segmentu równolegle z wykonywaniem instrukcji.

Do Intel 80386 rozszerzone offsety, a także ograniczenie pola segmentu w każdym deskryptor segmentu do 32 bitów, co umożliwia segment obejmować całą przestrzeń pamięci. Wprowadzono również wsparcie w trybie chronionym dla stronicowania , mechanizmu umożliwiającego korzystanie ze stronicowanej pamięci wirtualnej (przy rozmiarze strony 4 KB). Stronicowanie umożliwia procesorowi mapowanie dowolnej strony z obszaru pamięci wirtualnej na dowolną stronę z obszaru pamięci fizycznej. W tym celu wykorzystuje dodatkowe tabele mapowania w pamięci zwane tabelami stron. Tryb chroniony w 80386 może działać z włączonym lub wyłączonym stronicowaniem; mechanizm segmentacji jest zawsze aktywny i generuje adresy wirtualne, które są następnie mapowane przez mechanizm stronicowania, jeśli jest włączony. Mechanizm segmentacji można również skutecznie wyłączyć, ustawiając wszystkie segmenty tak, aby miały adres bazowy równy 0 i limit rozmiaru równy całej przestrzeni adresowej; wymaga to również minimalnej tablicy deskryptorów segmentu zawierającej tylko cztery deskryptory (ponieważ segmenty FS i GS nie muszą być używane).

Stronicowanie jest szeroko stosowane w nowoczesnych wielozadaniowych systemach operacyjnych. Linux , 386BSD i Windows NT zostały opracowane dla 386, ponieważ był to pierwszy procesor o architekturze Intela obsługujący stronicowanie i 32-bitowe przesunięcie segmentów. Architektura 386 stała się podstawą dalszego rozwoju serii x86.

Procesory x86 obsługujące tryb chroniony uruchamiają się w trybie rzeczywistym w celu zapewnienia zgodności wstecznej ze starszą klasą procesorów 8086. Po włączeniu (czyli rozruchu ) procesor inicjuje się w trybie rzeczywistym, a następnie rozpoczyna wykonywanie instrukcji. Kod rozruchowy systemu operacyjnego, który może być przechowywany w pamięci ROM , może wprowadzić procesor w tryb chroniony, aby umożliwić stronicowanie i inne funkcje. Instrukcja ustawiona w trybie chronionym jest podobna do tej używanej w trybie rzeczywistym. Jednak pewne ograniczenia, które dotyczą trybu rzeczywistego (takie jak brak możliwości użycia ax,cx,dx w adresowaniu) nie mają zastosowania w trybie chronionym. I odwrotnie, arytmetyka segmentowa, powszechna praktyka w kodzie trybu rzeczywistego, nie jest dozwolona w trybie chronionym.

Tryb wirtualny 8086

Istnieje również podtryb działania w 32-bitowym trybie chronionym (inaczej tryb chroniony 80386) zwany trybem wirtualnym 8086 , znanym również jako tryb V86 . Jest to w zasadzie specjalny hybrydowy tryb operacyjny, który umożliwia uruchamianie programów i systemów operacyjnych w trybie rzeczywistym pod kontrolą systemu operacyjnego nadzorcy trybu chronionego. Pozwala to na dużą elastyczność w uruchamianiu zarówno programów trybu chronionego, jak i programów trybu rzeczywistego jednocześnie. Ten tryb jest dostępny wyłącznie dla 32-bitowej wersji trybu chronionego; nie istnieje w 16-bitowej wersji trybu chronionego ani w trybie długim.

Tryb długi

W połowie lat 90. było oczywiste, że 32-bitowa przestrzeń adresowa architektury x86 ogranicza jej wydajność w aplikacjach wymagających dużych zbiorów danych. 32-bitowa przestrzeń adresowa pozwoliłaby procesorowi bezpośrednio zaadresować tylko 4 GB danych, czyli rozmiar przewyższany przez aplikacje, takie jak przetwarzanie wideo i silniki baz danych . Korzystając z adresów 64-bitowych, możliwe jest bezpośrednie adresowanie 16  EiB danych, chociaż większość architektur 64-bitowych nie obsługuje dostępu do pełnej 64-bitowej przestrzeni adresowej; na przykład AMD64 obsługuje tylko 48 bitów z adresu 64-bitowego, podzielonego na cztery poziomy stronicowania.

W 1999 r. AMD opublikowało (prawie) kompletną specyfikację 64-bitowego rozszerzenia architektury x86, które nazwali x86-64 z deklarowanymi zamiarami produkcji. Ten projekt jest obecnie używany w prawie wszystkich procesorach x86, z pewnymi wyjątkami przeznaczonymi dla systemów wbudowanych .

Masowo produkowane układy x86-64 przeznaczone na rynek ogólny były dostępne cztery lata później, w 2003 roku, po tym, jak poświęcono czas na przetestowanie i udoskonalenie pracujących prototypów; mniej więcej w tym samym czasie początkowa nazwa x86-64 została zmieniona na AMD64 . Sukces linii procesorów AMD64 w połączeniu z letnim przyjęciem architektury IA-64 zmusił Intel do wydania własnej implementacji zestawu instrukcji AMD64. Intel wcześniej zaimplementował obsługę AMD64, ale zdecydował się nie włączać go w nadziei, że AMD nie wprowadzi AMD64 na rynek, zanim nowy zestaw instrukcji Itanium IA-64 zostanie powszechnie przyjęty. Nazwał swoją implementację AMD64 jako EM64T , a później przemianował ją na Intel 64 .

W swojej literaturze i nazwach wersji produktów firmy Microsoft i Sun odnoszą się do AMD64/Intel 64 łącznie jako x64 w systemach operacyjnych Windows i Solaris . Dystrybucje Linuksa odnoszą się do niego jako „x86-64”, jego wariant „x86_64” lub „amd64”. Systemy BSD używają "amd64", podczas gdy macOS używa "x86_64".

Tryb długi jest głównie rozszerzeniem zestawu instrukcji 32-bitowych, ale w przeciwieństwie do przejścia z 16 do 32 bitów, wiele instrukcji zostało usuniętych w trybie 64-bitowym. Nie wpływa to na rzeczywistą wsteczną kompatybilność binarną (która wykonałaby starszy kod w innych trybach, które zachowują wsparcie dla tych instrukcji), ale zmienia sposób, w jaki muszą działać asembler i kompilatory dla nowego kodu.

Był to pierwszy przypadek, gdy duże rozszerzenie architektury x86 zostało zainicjowane i stworzone przez producenta innego niż Intel. Po raz pierwszy firma Intel zaakceptowała technologię tego rodzaju z zewnętrznego źródła.

Rozszerzenia

Jednostka zmiennoprzecinkowa

Wczesne procesory x86 może być rozszerzony o zmiennoprzecinkowej sprzętu w postaci szeregu zmiennoprzecinkowych numeryczna współpracowników procesorów o nazwach takich jak 8087 , 80287 i 80387, w skrócie x87. Było to również znane jako NPX ( Numeric Processor eXtension ), trafna nazwa, ponieważ koprocesory, używane głównie do obliczeń zmiennoprzecinkowych, wykonywały również operacje na liczbach całkowitych zarówno w formacie binarnym, jak i dziesiętnym. Z nielicznymi wyjątkami, 80486 i kolejne procesory x86 zintegrowały następnie tę funkcjonalność x87 na chipie, co sprawiło, że instrukcje x87 stały się de facto integralną częścią zestawu instrukcji x86.

Każdy rejestr x87, znany jako ST(0) do ST(7), ma szerokość 80 bitów i przechowuje liczby w formacie IEEE zmiennoprzecinkowym o podwójnej precyzji. Rejestry te są zorganizowane jako stos z ST(0) jako wierzchołkiem. Dokonano tego w celu zaoszczędzenia miejsca na opcode, a zatem rejestry są losowo dostępne tylko dla każdego operandu w instrukcji rejestr-rejestr; ST0 musi zawsze być jednym z dwóch operandów, źródłowym lub docelowym, niezależnie od tego, czy drugim operandem jest ST(x) czy operand pamięci. Jednak losowy dostęp do rejestrów stosu można uzyskać za pomocą instrukcji, która wymienia dowolny określony ST(x) na ST(0).

Operacje obejmują funkcje arytmetyczne i transcendentalne, w tym funkcje trygonometryczne i wykładnicze, oraz instrukcje ładujące wspólne stałe (takie jak 0; 1; e, podstawa logarytmu naturalnego; log2(10); i log10(2)) do jednego z rejestry stosu. Podczas gdy zdolność do liczb całkowitych jest często pomijana, x87 może operować na większych liczbach całkowitych za pomocą jednej instrukcji niż 8086, 80286, 80386 lub dowolny procesor x86 bez rozszerzeń 64-bitowych i powtarzalne obliczenia liczb całkowitych nawet na małych wartościach (np. 16-bitowy) można przyspieszyć wykonując instrukcje liczb całkowitych na procesorach x86 i x87 równolegle. (Procesor x86 kontynuuje pracę, podczas gdy koprocesor x87 oblicza, a x87 wysyła sygnał do x86 po zakończeniu lub przerywa x86, jeśli wymaga uwagi z powodu błędu.)

MMX

MMX to zestaw instrukcji SIMD zaprojektowany przez firmę Intel i wprowadzony w 1997 roku dla mikroprocesora Pentium MMX . Zestaw instrukcji MMX został opracowany na podstawie podobnej koncepcji zastosowanej po raz pierwszy w Intel i860 . Jest obsługiwany przez większość kolejnych procesorów IA-32 firmy Intel i innych producentów. MMX jest zwykle używany do przetwarzania wideo (na przykład w aplikacjach multimedialnych).

MMX dodał do architektury 8 nowych rejestrów , znanych jako MM0 do MM7 (odtąd MMn ). W rzeczywistości te nowe rejestry były tylko aliasami dla istniejących rejestrów stosu x87 FPU. W związku z tym wszystko, co zostało zrobione na stosie zmiennoprzecinkowym, wpłynęłoby również na rejestry MMX. W przeciwieństwie do stosu FP, te rejestry MMn były stałe, a nie względne i dlatego były dostępne losowo. Zestaw instrukcji nie przyjął semantyki podobnej do stosu, aby istniejące systemy operacyjne mogły nadal poprawnie zapisywać i przywracać stan rejestru podczas wielozadaniowości bez modyfikacji.

Każdy z rejestrów MMn to 64-bitowe liczby całkowite. Jednak jednym z głównych pojęć zestawu instrukcji MMX jest koncepcja spakowanych typów danych , co oznacza, że ​​zamiast całego rejestru dla pojedynczej 64-bitowej liczby całkowitej ( quadword ) można użyć go do zawarcia dwóch 32-bitowych liczb całkowitych ( doubleword ), cztery 16-bitowe liczby całkowite ( word ) lub osiem 8-bitowych liczb całkowitych ( byte ). Biorąc pod uwagę, że 64-bitowe rejestry MMn MMX są aliasowane do stosu FPU, a każdy z rejestrów zmiennoprzecinkowych ma szerokość 80 bitów, górne 16 bitów rejestrów zmiennoprzecinkowych jest nieużywanych w MMX. Te bity są ustawiane na jedynek przez dowolną instrukcję MMX, która odpowiada zmiennoprzecinkowej reprezentacji NaN lub nieskończoności.

3D teraz!

W 1997 roku AMD wprowadziło 3DNow!. Wprowadzenie tej technologii zbiegło się w czasie z rozwojem aplikacji rozrywkowych 3D i zostało zaprojektowane w celu poprawy wydajności przetwarzania wektorowego przez procesor w aplikacjach intensywnie korzystających z grafiki. Twórcy gier wideo 3D i dostawcy sprzętu graficznego 3D używają 3DNow! w celu zwiększenia wydajności procesorów AMD z serii K6 i Athlon .

3D teraz! został zaprojektowany jako naturalna ewolucja MMX od liczb całkowitych do zmiennoprzecinkowych. Jako taki używa dokładnie tej samej konwencji nazewnictwa rejestrów co MMX, czyli od MM0 do MM7. Jedyna różnica polega na tym, że zamiast pakować liczby całkowite do tych rejestrów, do każdego rejestru pakowane są dwie liczby zmiennoprzecinkowe o pojedynczej precyzji . Zaletą aliasingu rejestrów FPU jest to, że te same instrukcje i struktury danych, które są używane do zapisywania stanu rejestrów FPU, mogą być również użyte do zapisania 3DNow! rejestrować stany. W związku z tym nie są wymagane żadne specjalne modyfikacje w systemach operacyjnych, które w przeciwnym razie by o nich nie wiedziały.

SSE i AVX

W 1999 roku Intel wprowadził Streaming SIMD Extensions (SSE), zestaw instrukcji , po roku 2000 z SSE2. Pierwszy dodatek umożliwił odciążenie podstawowych operacji zmiennoprzecinkowych ze stosu x87, a drugi sprawił, że MMX stał się prawie przestarzały i pozwolił na realistyczną obsługę instrukcji przez konwencjonalne kompilatory. Wprowadzony w 2004 roku wraz z wersją Prescott procesora Pentium 4 , SSE3 dodał specjalne instrukcje dotyczące pamięci i obsługi wątków, aby zwiększyć wydajność technologii Intel HyperThreading . Firma AMD licencjonowała zestaw instrukcji SSE3 i zaimplementowała większość instrukcji SSE3 dla swoich procesorów w wersji E i późniejszych Athlon 64. Athlon 64 nie obsługuje HyperThreadingu i brakuje mu instrukcji SSE3 używanych tylko do HyperThreadingu.

SSE odrzuciło wszystkie starsze połączenia ze stosem FPU. Oznaczało to również, że ten zestaw instrukcji odrzucił wszystkie starsze połączenia z poprzednimi generacjami zestawów instrukcji SIMD, takich jak MMX. Ale uwolniło to projektantów, pozwalając im na używanie większych rejestrów, nieograniczonych rozmiarem rejestrów FPU. Projektanci stworzyli osiem 128-bitowych rejestrów, nazwanych od XMM0 do XMM7. ( Uwaga : w AMD64 liczba rejestrów SSE XMM została zwiększona z 8 do 16.) Jednak wadą było to, że systemy operacyjne musiały mieć świadomość tego nowego zestawu instrukcji, aby móc zapisywać swoje stany rejestrów . Dlatego firma Intel stworzyła nieco zmodyfikowaną wersję trybu chronionego, zwaną trybem rozszerzonym, który umożliwia korzystanie z instrukcji SSE, podczas gdy w zwykłym trybie chronionym pozostają one wyłączone. System operacyjny, który jest świadomy SSE, aktywuje tryb rozszerzony, podczas gdy nieświadomy system operacyjny wejdzie tylko w tradycyjny tryb chroniony.

SSE to zestaw instrukcji SIMD, który działa tylko na wartościach zmiennoprzecinkowych, takich jak 3DNow!. Jednak w przeciwieństwie do 3DNow! zrywa wszystkie starsze połączenia ze stosem FPU. Ponieważ ma większe rejestry niż 3DNow!, SSE może zapakować do swoich rejestrów dwukrotnie większą liczbę zmiennych zmiennoprzecinkowych o pojedynczej precyzji . Oryginalne SSE ograniczało się tylko do liczb o pojedynczej precyzji, takich jak 3DNow!. SSE2 wprowadził również możliwość pakowania liczb o podwójnej precyzji , co 3DNow! nie miał możliwości wykonania, ponieważ liczba podwójnej precyzji ma rozmiar 64-bitowy, co odpowiadałoby pełnemu rozmiarowi pojedynczego 3DNow! Rejestr MMn. Przy 128 bitach rejestry SSE XMMn mogą spakować dwa zmienne o podwójnej precyzji w jednym rejestrze. Tak więc SSE2 jest znacznie bardziej odpowiedni do obliczeń naukowych niż SSE1 lub 3DNow!, które były ograniczone tylko do pojedynczej precyzji. SSE3 nie wprowadza żadnych dodatkowych rejestrów.

Advanced Vector Extensions (AVX) podwoił rozmiar rejestrów SSE do 256-bitowych rejestrów YMM. Wprowadzono również schemat kodowania VEX, aby pomieścić większe rejestry, a także kilka instrukcji do permutacji elementów. AVX2 nie wprowadził dodatkowych rejestrów, ale był godny uwagi z powodu dodania instrukcji maskowania, zbierania i tasowania.

AVX-512 oferuje kolejną rozbudowę do 32 512-bitowych rejestrów ZMM oraz nowy schemat EVEX. W przeciwieństwie do swoich poprzedników wyposażonych w monolityczne rozszerzenie, jest podzielony na wiele podzbiorów, które mogą zostać zaimplementowane przez określone modele procesorów.

Rozszerzenie adresu fizycznego (PAE)

Rozszerzenie adresu fizycznego lub PAE zostało po raz pierwszy dodane w Intel Pentium Pro , a później przez AMD w procesorach Athlon, aby umożliwić adresowanie do 64 GB pamięci RAM. Bez PAE fizyczna pamięć RAM w 32-bitowym trybie chronionym jest zwykle ograniczona do 4  GB . PAE definiuje inną strukturę tablicy strony z szerszymi wpisami tablicy strony i trzecim poziomem tablicy strony, umożliwiając dodatkowe bity adresu fizycznego. Chociaż początkowe implementacje na 32-bitowych procesorach teoretycznie obsługiwały do ​​64 GB pamięci RAM, ograniczenia chipsetu i innych platform często ograniczały to, co faktycznie można było wykorzystać. Procesory x86-64 definiują struktury tablic stron, które teoretycznie dopuszczają do 52 bitów adresu fizycznego, chociaż znowu problemy dotyczące chipsetu i innych platform (takich jak liczba dostępnych gniazd DIMM i maksymalna możliwa pamięć RAM na moduł DIMM) uniemożliwiają tak duży adres fizyczny przestrzeń do zrealizowania. Na procesorach x86-64 tryb PAE musi być aktywny przed przełączeniem w tryb długi i musi pozostać aktywny, gdy tryb długi jest aktywny, więc w trybie długim nie ma trybu „bez PAE”. Tryb PAE nie wpływa na szerokość adresów liniowych lub wirtualnych.

x86-64

W klastrach superkomputerów (śledzonych przez dane z listy TOP 500 i zwizualizowanych na powyższym diagramie, ostatnia aktualizacja w 2013 r.) pojawienie się rozszerzeń 64-bitowych dla architektury x86 umożliwiło korzystanie z 64-bitowych procesorów x86 firm AMD i Intel (kolor turkusowy i niebieski zakreskowany, na schemacie) w celu zastąpienia większości architektur procesorów RISC stosowanych wcześniej w takich systemach (w tym PA-RISC , SPARC , Alpha i innych) oraz 32-bitowego x86 (zielona na schemacie), mimo że Intel początkowo próbował bezskutecznie zastąpić x86 nową niezgodną architekturą 64-bitową w procesorze Itanium . Główną architekturą inną niż x86, która jest nadal używana od 2014 r. w klastrach superkomputerów, jest Power ISA, używana przez mikroprocesory IBM POWER (niebieskie z diamentowymi kafelkami na schemacie), ze SPARC jako odległą sekundą.

W 2000 roku ograniczenia 32-bitowych procesorów x86 w adresowaniu pamięci były przeszkodą w ich wykorzystaniu w klastrach obliczeniowych o wysokiej wydajności i potężnych stacjach roboczych. Przestarzały 32-bitowy x86 konkurował ze znacznie bardziej zaawansowanymi 64-bitowymi architekturami RISC, które mogły adresować znacznie więcej pamięci. Intel i cały ekosystem x86 potrzebowały 64-bitowego adresowania pamięci, jeśli x86 ma przetrwać erę 64-bitowego przetwarzania, ponieważ aplikacje dla stacji roboczych i komputerów stacjonarnych wkrótce zaczęły osiągać granice 32-bitowego adresowania pamięci. Jednak Intel uznał, że nadszedł właściwy czas, aby zrobić odważny krok i wykorzystać przejście na 64-bitowe komputery stacjonarne do ogólnego odejścia od architektury x86, co ostatecznie zakończyło się niepowodzeniem.

W 2001 r. Intel próbował wprowadzić architekturę 64-bitową inną niż x86 o nazwie IA-64 w swoim procesorze Itanium , początkowo dążąc do rynku obliczeń o wysokiej wydajności , mając nadzieję, że ostatecznie zastąpi ona 32-bitową x86. Chociaż IA-64 był niekompatybilny z x86, procesor Itanium zapewniał możliwości emulacji do tłumaczenia instrukcji x86 na IA-64, ale wpłynęło to na wydajność programów x86 tak bardzo, że rzadko, jeśli w ogóle, był użyteczny dla użytkowników: programistów powinien przepisać programy x86 dla architektury IA-64, inaczej ich wydajność na Itanium byłaby o rząd wielkości gorsza niż na prawdziwym procesorze x86. Rynek odrzucił procesor Itanium, ponieważ złamał wsteczną kompatybilność i wolał nadal używać chipów x86, a bardzo niewiele programów zostało przepisanych dla IA-64.

AMD zdecydowało się obrać inną drogę w kierunku adresowania pamięci 64-bitowej, upewniając się, że kompatybilność wsteczna nie ucierpi. W kwietniu 2003 roku AMD wypuściło pierwszy procesor x86 z 64-bitowymi rejestrami ogólnego przeznaczenia, Opteron , zdolny do adresowania znacznie ponad 4  GB pamięci wirtualnej przy użyciu nowego rozszerzenia x86-64 (znanego również jako AMD64 lub x64). Rozszerzenia 64-bitowe do architektury x86 zostały włączone tylko w nowo wprowadzonym trybie długim , dlatego aplikacje i systemy operacyjne 32-bitowe i 16-bitowe mogły po prostu nadal używać procesora AMD64 w trybie chronionym lub innym, bez najmniejszego poświęcenia wydajność i pełna kompatybilność z powrotem do oryginalnych instrukcji 16-bitowego Intel 8086. Rynek zareagował pozytywnie, przyjmując 64-bitowe procesory AMD zarówno do wysokowydajnych aplikacji, jak i komputerów biznesowych lub domowych.

Widząc, że rynek odrzuca niekompatybilny procesor Itanium i Microsoft wspierający AMD64, Intel musiał zareagować i wprowadził swój własny procesor x86-64, Prescott Pentium 4, w lipcu 2004 roku. W rezultacie, procesor Itanium z zestawem instrukcji IA-64 jest rzadko używany, a x86, poprzez swoje wcielenie x86-64, jest nadal dominującą architekturą procesora w komputerach nieembedowanych.

x86-64 wprowadził również bit NX , który oferuje pewną ochronę przed błędami bezpieczeństwa spowodowanymi przepełnieniem bufora .

W wyniku 64-bitowego wkładu AMD w linię x86 i jego późniejszej akceptacji przez Intela, 64-bitowe architektury RISC przestały być zagrożeniem dla ekosystemu x86 i prawie zniknęły z rynku stacji roboczych. x86-64 zaczęto wykorzystywać w potężnych superkomputerach (we wcieleniach AMD Opteron i Intel Xeon ), rynku, który wcześniej był naturalnym środowiskiem dla 64-bitowych projektów RISC (takich jak mikroprocesory IBM POWER czy procesory SPARC ). Wielki krok w kierunku przetwarzania 64-bitowego i utrzymanie kompatybilności wstecznej z oprogramowaniem 32- i 16-bitowym sprawiły, że architektura x86 stała się dziś niezwykle elastyczną platformą, z chipami x86 używanymi z małych systemów o niskim poborze mocy (na przykład Intel Quark i Intel Atom ) po szybkie komputery stacjonarne do gier (na przykład Intel Core i7 i AMD FX / Ryzen ), a nawet zdominują duże klastry superkomputerów , skutecznie pozostawiając jedynie 32-bitową i 64-bitową architekturę RISC ARM jako konkurenta w rynek smartfonów i tabletów .

Wirtualizacja

Przed 2005 r. procesory architektury x86 nie były w stanie spełnić wymagań Popka i Goldberga – specyfikacji wirtualizacji stworzonej w 1974 r. przez Geralda J. Popka i Roberta P. Goldberga . Jednak zarówno zastrzeżone, jak i otwarte produkty do wirtualizacji x86 zostały opracowane przy użyciu wirtualizacji opartej na oprogramowaniu . Zastrzeżone systemy obejmują Hyper-V , Parallels Workstation , VMware ESX , VMware Workstation , VMware Workstation Player i Windows Virtual PC , podczas gdy systemy bezpłatne i typu open source obejmują QEMU , maszynę wirtualną opartą na jądrze , VirtualBox i Xen .

Wprowadzenie zestawów instrukcji AMD-V i Intel VT-x w 2005 roku umożliwiło procesorom x86 spełnienie wymagań wirtualizacji Popka i Goldberga.

AES

Zobacz też

Uwagi

Bibliografia

Dalsza lektura

Zewnętrzne linki