x86-64 — Википедия

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

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

Microsoft и Oracle используют термин «x64» для обозначения данной версии архитектуры x86. Однако, в каталоге файлов для 64-разрядных версий Microsoft Windows он известен как «amd64» (в то время как для архитектуры x86 используется «i386»). Подобная практика также применяется в репозиториях многих дистрибутивов 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-битных программ.

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

«Унаследованный» режим позволяет процессору x86-64 выполнять команды, предназначенные для процессоров x86, обеспечивая таким образом полную совместимость с 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 года.