x86-64

Z Wikipedii, wolnej encyklopedii
(Przekierowano z X86 64)
Skocz do: nawigacji, wyszukiwania

x86-64 (nazywane też AMD64 i x64) – opracowane przez AMD rozszerzenie architektury IA-32, którego głównym celem było ułatwienie zarządzania pamięcią operacyjną powyżej 4 GiB poprzez dodanie obsługi 64-bitowych liczb całkowitych do jednostki arytmetyczno-logicznej. Ze względu na zachowanie wysokiej zgodności wstecznej, możliwe jest jednoczesne uruchamianie aplikacji 32- i 64-bitowych. Pierwszymi procesorami implementującymi nową architekturę były zaprezentowane w roku 2003 Opteron i Athlon 64. Później swoje implementacje wprowadziły firmy Intel (Intel 64) i VIA.

Nazewnictwo[edytuj | edytuj kod]

Początkowo architektura była nazywana AMD64. Później wprowadzono dodatkowo nazwy x86-64 i x64, które były bardziej neutralne i nie wskazywały na konkretnego producenta procesorów, pierwszy termin jednak pozostał w użyciu i zasadniczo odnosi się do implementacji wszystkich producentów. Intel w swojej dokumentacji używa obecnie (rok 2012) terminu Intel 64, wcześniej były to IA-32e (ang. IA-32 extensions) i EM64T (ang. Extended Memory 64 Technology). Ostatecznie wybór nazewnictwa w dużej mierze uzależniony jest od systemu operacyjnego.

Opis architektury[edytuj | edytuj kod]

Zestaw instrukcji x86_64 jest rozszerzeniem zestawu instrukcji x86 głównie o rozkazy operujące na 64-bitowych operandach. Główną techniczną motywacją rozszerzenia tego najpopularniejszego w świecie procesorów zestawu instrukcji, było zapotrzebowanie ze strony użytkowników zaawansowanego oprogramowania operującego na dużych ilościach danych, na zwiększoną przestrzeń adresową – w klasycznej już architekturze x86 liniowa przestrzeń adresowa ma wielkość 2^{32} bajtów = 4 GiB. Wraz z PAE procesory x86 mają 36-bitową szynę adresu, czyli mogą adresować 64 GiB pamięci, jednak oprogramowanie korzysta z pamięci powyżej 4 GiB prawie jak kiedyś z rozszerzeń EMS. Poniżej wymieniono najważniejsze zmiany wprowadzone przez AMD64:

  • Nowe rejestry procesora. Liczba rejestrów ogólnego przeznaczenia (General Purpose Registers – GPR) została zwiększona z 8 w architekturze x86 do 16, a maksymalna wielkość operandów - do 64 bitów. Dodatkowo, liczba 128-bitowych rejestrów SSE (używanych w instrukcjach SIMD) została zwiększona z 8 do 16. Powiększenie liczby widocznych dla użytkownika rejestrów pozwoliło na 5-15% zwiększenie wydajności.
  • Większa przestrzeń adresowa. Architektura x86_64 definiuje przestrzeń adresową ograniczoną do 48 bitów (w aktualnych implementacjach używa się 40 bitów, co przekłada się na możliwość zaadresowania do 1 TiB pamięci operacyjnej). Architektura IA-32 pozwala na zaadresowanie jedynie 4 GiB, z czego dostępne dla użytkownika (i aplikacji) jest najczęściej 2 GiB lub 3 GiB (podział ten zależny jest od systemu operacyjnego). Z uwagi na rozszerzenia wprowadzone w Pentium Pro możliwe jest zainstalowanie do 64 GiB RAM, jednak nie jest to pamięć liniowo równocześnie dostępna. W przyszłości, implementacje architektury AMD64 mogą używać pełnych 48 bitów, co pozwoli na bezpośredni dostęp do 256 TiB pamięci operacyjnej. Przy użyciu systemu operacyjnego korzystającego z architektury AMD64 możliwe jest zwiększenie dostępnej pamięci operacyjnej dla pojedynczego 32-bitowego procesu do 4GiB, bez potrzeby rekompilacji i zmian w kodzie programu.
  • Adresowanie "RIP-relative". Rozkazy x86_64 mogą odwoływać się do danych zawartych pod adresami określonymi względem wskaźnika programu (Instruction Pointer – IP), co pozwala na zwiększenie efektywności kodu odwołującego się do bibliotek dzielonych. Adresowanie to pozwala również na umieszczanie odwołań do bibliotek dzielonych pod dowolnym adresem wirtualnym dostępnym w przestrzeni adresowej.
  • Rozkazy SSE. Architektura x86_64 zawiera zestawy instrukcji SIMD Intela pod nazwą SSE i SSE2. Wszystkie implementacje architektury x86-64 są kompatybilne jednocześnie z zestawami instrukcji MMX i x87.
  • NX-bit. Bit ten (NX - No Execute) jest odpowiedzialny za włączenie/wyłączenie zabezpieczenia obszaru pamięci operacyjnej przed traktowaniem go przez procesor jako zbioru instrukcji do wykonania (z reguły zarządzaniem pamięcią operacyjną powierza się systemowi operacyjnemu). W architekturze x86-64 ochrona obszaru pamięci jest dostępna zarówno w trybie 32-bitowym, jak i 64-bitowym, i jest wspierana przez Linux, Solaris, Windows XP SP2, Windows Server 2003 SP1 oraz nowsze ich wersje. Można odnotować, że funkcjonalność bitu NX była obecna od dawna w 32-bitowej architekturze x86 w trybie PAE (Physical Address Extension), wprowadzonym wraz z procesorem Pentium Pro Intela, ale z powodu skomplikowanego adresowania pamięci i problemów z wydajnością nie zyskała wtedy popularności.

Tryby pracy[edytuj | edytuj kod]

Tryb pracy Wymagany system operacyjny Wymagana rekompilacja aplikacji Domyślny rozmiar adresów Domyślny rozmiar operandów Rozszerzenia rozkazów Typowy rozmiar GPR
Tryb
Long
Tryb 64-bit 64-bitowy tak 64 32 tak 64
Tryb
Compatibility
nie 32 nie 32
16 16 16
Tryb
Legacy
Tryb
Protected
32-bitowy nie 32 32 nie 32
16 16
Tryb wirtualny 8086 16 16 16
Tryb
Real
16-bitowy

Wyjaśnienia dot. trybów pracy[edytuj | edytuj kod]

Architektura AMD64 przewiduje dwa główne tryby pracy:

Long
Tryb ten jest podstawowym trybem działania procesora w architekturze x86_64, jest kombinacją natywnego trybu 64-bitowego, oraz trybu chronionego, nie zapewnia jednak wsparcia dla trybów rzeczywistego i wirtualnego. W trybie long pracują liczne systemy operacyjne: Linuksa, BSD, Solaris, Microsoft Windows, Mac OS X i inne.
Jako że zbiór rozkazów x86_64 zawiera wszystkie rozkazy x86, wykonywanie kodu x86 praktycznie nie jest obciążone żadnym narzutem. 32-bitowe aplikacje rekompilowane z użyciem zestawu rozkazów x86_64 mogą odnieść korzyść ze stosowania przez kompilator dodatkowych rejestrów dostępnych w trybie long.
W trybie long, 64-bitowy system operacyjny może uruchamiać równocześnie aplikacje 16-, 32- i 64-bitowe. W przypadku 64-bitowych systemów operacyjnych Microsoftu, takich jak Windows XP Professional x64 Edition, nie istnieje możliwość uruchamiania w tym trybie aplikacji 16-bitowych (prawdopodobnie ze względu na trudności w ewentualnej implementacji warstwy zapewniającej kompatybilność z aplikacjami 16-bitowymi w podsystemie WOW64).
Legacy
Domyślny tryb, w którym jest uruchamiany procesor (dokładniej jest uruchamiany w trybie rzeczywistym 8086). Tryb ten jest używany przez 16-bitowe systemy operacyjne (takie jak MS-DOS), jak również systemy 32-bitowe (takie jak Microsoft Windows XP). W trybie tym mogą być uruchamiane jedynie aplikacje 16- i 32-bitowe, programy 64-bitowe nie będą działały.

Analiza rynku[edytuj | edytuj kod]

Wprowadzenie architektury x86_64 było pierwszym rozszerzeniem wprowadzonym przez AMD, które zostało później zaadaptowane przez firmę Intel (Intel 64), co wcześniej nie miało miejsca. Z drugiej strony jest to jednak przykład podobnej do intelowskiej strategii rozszerzania istniejącej architektury bez pozbywania się kompatybilności wstecz (Intel rozszerzył architekturę x86 do 32-bitów wraz z wprowadzeniem zgodnego wstecz procesora 80386). Architektura x86_64 rozszerza swoją poprzedniczkę (IA-32) o 64-bitowe rejestry ogólnego przeznaczenia, zachowując 16- i 32-bitowe tryby działania procesora. Tryb 64-bitowy również posiada mechanizmy zapewniające w dużej mierze zgodność wstecz z istniejącym oprogramowaniem, ułatwiając przejście na nową architekturę.

Intel początkowo był niechętny wprowadzeniu rozszerzeń 64-bitowych dla architektury x86. Spowodowane było to bardzo dużymi inwestycjami w linię procesorów wykorzystujących koncepcję EPIC (patrz IA-64) i chęcią maksymalnego spowolnienia rozwoju procesorów x86. Strategia ta poniosła porażkę. Nowa architektura Intela nie zaoferowała znacznie lepszej wydajności niż istniejące produkty RISC (np. seria IBM POWER) czy bardzo udana seria AMD K8. Decydujące okazało się jednak wsparcie dla architektury x86_64 ze strony twórców oprogramowania (w tym Sun, Microsoft czy twórców Linuksa). Intel został więc zmuszony przez rynek do zmiany swoich planów i wprowadzenia własnej implementacji x86_64.

Implementacje architektury[edytuj | edytuj kod]

Istnieją pewne różnice między implementacjami różnych firm, a także między starszymi i nowszymi procesorami. Są jednak na tyle drobne, że tylko producenci systemów operacyjnych i kompilatorów powinni się nimi martwić.

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]