x86-64

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

x86-64 (также AMD64/Intel64/EM64T) — 64-битная версия (изначально — расширение) архитектуры x86, разработанная компанией AMD и представленная в 2000 году[1], позволяющая выполнять программы в 64-разрядном режиме.

Это расширение архитектуры x86, а ныне — версия архитектуры x86, почти полностью обратно совместимая с 32-разрядной версией архитектуры x86, известной ныне как IA-32.

Корпорации Microsoft и Oracle используют для обозначения этой версии архитектуры x86 термин «x64», однако каталог с файлами для архитектуры в 64-разрядных Microsoft Windows и называется «amd64» («i386» для соответственно архитектуры x86). Подобное наблюдается и в репозиториях большинства Linux-дистрибутивов.

Набор команд x86-64 в настоящее время поддерживается:

Применяемые названия

[править | править код]

Существует следующие варианты названий этой 64-битной версии x86:

  • x86-64 — первоначальный вариант. Именно под этим названием фирмой AMD была опубликована первая предварительная спецификация.
  • x64 — официальное название версий всех 64-битных ОС Windows и Solaris, также используемое как название архитектуры фирмами Microsoft и Oracle.
  • AA-64 (AMD Architecture 64) — так архитектуру назвал популярный неофициальный справочник sandpile.org (внеся информацию практически сразу после публикаций первой предварительной спецификации) по аналогии с IA-64.
  • Hammer Architecture — название по первым ядрам процессоров, поддерживавших x86-64 — AMD Clawhammer («гвоздодёр») и AMD Sledgehammer («кувалда»).
  • AMD64 — после выпуска первых Clawhammer и Sledgehammer в названии архитектуры появилось название фирмы-разработчика AMD. Сейчас является официальным для реализации AMD. Так же обозначает все версии Linux для 64-битной x86.
  • Yamhill Technology — первое название реализации архитектуры от Intel. Иногда упоминалось название CT (Clackamas Technology).
  • EM64T — первое официальное название реализации архитектуры от Intel. Расшифровывалось как Extended Memory 64 Technology.
  • IA-32e — иногда встречалось совместно с EM64T, чаще для обозначения длинного режима, который в документации Intel называется «режимом IA-32e».
  • Intel 64 — текущее официальное название реализации архитектуры от Intel. Постепенно Intel отказывается от наименований «IA-32», «IA-32e» и «EM64T» в пользу этого наименования, которое ныне является единственным официальным для реализации этой архитектуры от Intel.

Ныне наиболее распространенные наименования 64-битной версии x86 есть: «x64», «x86-64» и «AMD64».

Иногда упоминание AMD вводит пользователей в заблуждение, вплоть до того, что они отказываются использовать дистрибутивы родных версий операционной системы, мотивируя это тем, что на их процессоре Intel версия для AMD не будет работать, — на самом деле распространители ПО используют название amd64 лишь потому, что именно AMD была пионером в разработке 64-битной версии x86.

Часто пользователи путают архитектуру x86-64 с IA-64, ошибочно скачивая ПО для этой архитектуры, и затем обнаруживают, что программа не запускается. Во избежание подобных ошибок следует помнить, что Intel 64 и IA-64 — это совершенно разные, несовместимые между собой микропроцессорные архитектуры. Последняя несовместима с x86-64.
Представители Intel 64:

Представители IA-64: семейства Itanium и Itanium 2.

Режимы работы

[править | править код]
Режимы работы микропроцессоров

Процессоры данной архитектуры поддерживают два режима работы: Long mode («длинный» режим) и Legacy mode («унаследованный» — режим совместимости с 32-битным x86).

«Длинный» режим — «родной» для процессоров AMD64. Этот режим даёт возможность воспользоваться всеми преимуществами архитектуры x86-64. Для использования этого режима необходима любая 64-битная операционная система (например, Windows Server 2003/2003R2/2008/2008R2/2012, Windows XP Professional x64 Edition, Windows Vista x64, Windows 7/8/8.1/10/11 x64 или 64-битные варианты UNIX-подобных систем GNU/Linux, FreeBSD, OpenBSD, NetBSD (чистые 64-битные сборки, однако, имеют возможность запуска 32-битных приложений), Solaris (смешанная 32/64 сборка с разными ядрами для 32- и 64-битных процессоров), Mac OS X (смешанная 32/64 сборка с 32-битным ядром, начиная с версии 10.4.7).

Этот режим позволяет выполнять 64-битные программы. Также (для обратной совместимости) предоставляется поддержка выполнения 32-битного кода, — например, 32-битных приложений (естественно, 32-битные программы, даже будучи запущенными в 64-битной системе, не смогут использовать 64-битные системные библиотеки, и наоборот). Чтобы справиться с этой задачей, большинство 64-разрядных операционных систем предоставляет два набора необходимых системных API: один — для родных 64-битных приложений, и другой — для 32-битных программ (этой же методикой пользуются ранние 32-битные системы — например, Windows 95 и Windows NT — для выполнения 16-битных программ).

В «длинном» режиме упразднён ряд «рудиментов» архитектуры x86-32, — в частности таких, как режим виртуального 8086, сегментная модель памяти (однако, осталась возможность использования сегментов FS и GS, что полезно для быстрого нахождения важных данных потока при переключении задач), аппаратная многозадачность, а также ряд команд, как реализующих упраздненные возможности, так и работающие с BCD-числами, которые в новых программах практически не использовались. «Длинный» режим активируется установкой флага CR0.PG, который используется для включения страничного MMU (при условии что такое переключение разрешено (EFER.LME=1), в противном случае просто произойдет включение MMU в «унаследованном» режиме). Таким образом, невозможно исполнение 64-битного кода с запрещённым страничным преобразованием. Это создаёт определённые трудности в программировании, поскольку при переключении из «длинного» в «унаследованный» режим и обратно (например, для вызова функций BIOS или DOS, монитором виртуальной машины, и т. д.) требуется двойной сброс MMU, для чего код переключения должен находиться в тождественно отображённой странице.

Данный «унаследованный» режим позволяет x86-64-процессору выполнять команды для процессоров x86, и таким образом реализует полную совместимость с 32-битным кодом и 32-битным операционными системами для x86. В этом режиме процессор ведёт себя точно так же, как x86-процессор (например как Athlon или Pentium III). Функции и возможности, предоставляемые архитектурой x86-64 (например, 64-битные регистры), в этом режиме, естественно, недоступны. В этом режиме 64-битные программы и операционные системы работать не будут.

Особенности архитектуры

[править | править код]

Разработанный компанией AMD набор инструкций x86-64 (позднее переименованный в AMD64) — расширение архитектуры Intel IA-32 (x86-32). Основной отличительной особенностью AMD64 является поддержка 64-битных регистров общего назначения, 64-битных арифметических и логических операций над целыми числами и 64-битных виртуальных адресов. Для адресации новых регистров для команд введены так называемые «префиксы расширения регистра», для которых был выбран диапазон кодов 40h-4Fh, использующихся для команд INC <регистр> и DEC <регистр> в 32-битных режимах. Команды INC и DEC в 64-битном режиме должны кодироваться в более общей, двухбайтовой форме.

Архитектура x86-64 имеет:

  • 16 целочисленных 64-битных регистров общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15);
  • 8 80-битных регистров с плавающей точкой (ST0 — ST7);
  • 8 64-битных регистров Multimedia Extensions (MM0 — MM7, имеют общее пространство с регистрами ST0 — ST7);
  • 16 128-битных регистров SSE (XMM0 — XMM15);
  • 64-битный указатель RIP и 64-битный регистр флагов RFLAGS.

Сегментная модель организации памяти

[править | править код]

Разрабатывая архитектуру AMD64 (AMD-реализации x86-64), инженеры корпорации AMD решили навсегда покончить с главным «рудиментом» архитектуры x86 — сегментной моделью памяти, которая поддерживалась ещё со времён 8086. Однако из-за этого при разработке первой x86-64-версии своего продукта для виртуализации программисты компании VMware столкнулись с непреодолимыми трудностями при реализации виртуальной машины для 64-битных гостевых систем[2]: поскольку для отделения кода монитора от кода «гостя» программой использовался механизм сегментации, эта задача стала практически неразрешимой.

Осознав ошибку, AMD вернула ограниченный вариант сегментной организации памяти, начиная с ревизии D архитектуры AMD64, что позволило запускать 64-битные ОС в виртуальных машинах. Intel этому примеру не последовала, и на её процессорах, не поддерживающих средства аппаратной виртуализации Intel VT (Intel Virtualization Technology)[3], запустить 64-битную виртуальную машину невозможно[4]. Для проверки того, возможен ли на процессоре запуск 64-битных гостевых ОС, VMware предоставляет вместе со своими продуктами специальную утилиту.

Запуск и установка 64-битных гостевых систем на данный момент (с 2013 г.) уже возможна (продукт компании VMware — ESXi (workstation и тд.) — поддерживает архитектуру x86-64).

Следует отметить, что первоначально попавшие «под нож» команды LAHF и SAHF, которые также активно используются ПО виртуализации, затем были возвращены в систему команд. С распространением средств аппаратной виртуализации (Intel VT, AMD-V) потребность в сегментации постепенно отпадет.

Примечания

[править | править код]
  1. AMD Releases x86-64™ Architectural Specification; Enables Market Driven Migration to 64-Bit Computing
  2. http://www.pagetable.com/?p=25 Архивная копия от 18 июля 2011 на Wayback Machine «The AMD64 …retired ..most of segmentation. But this broke VMware. While VMware could still virtualize 32 bit operating systems on AMD64 CPUs, they could not virtualize 64 bit operating systems, because they required segment limits.»
  3. Intel® Virtualization Technology (Intel® VT) (англ.). Intel. Дата обращения: 14 мая 2020. Архивировано 25 мая 2020 года.
  4. VMware Knowledge Base. kb.vmware.com. Дата обращения: 14 мая 2020. Архивировано 27 мая 2020 года.