SlideShare a Scribd company logo
1 of 12
Download to read offline
Архитектура AMD64 (EM64T)
Авторы: Евгений Рыжков, Андрей Карпов

Дата: 02.10.2008


Аннотация
В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T
компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.


Введение
Развитие задач, решаемых с помощью вычислительной техники, постоянно повышает требования
к аппаратуре, на которой эти задачи решаются. Требования к вычислительным системам класса
персональных компьютеров увеличиваются уже более 20 лет год от года. Это происходит из-за
желания людей решать на персональных компьютерах все более сложные задачи, которые ранее
решались лишь на высокопроизводительных мэйнфреймах.

Какие же требования возникают к персональным компьютерам для решения сложных задач?
Разумеется, это требования по объему оперативной памяти и быстродействию процессора (не
путать с частотой!). Господствующая последнее десятилетие архитектура IA32 (Intel Architecture
32) предлагает 4Гб (2^32) оперативной памяти, из которой приложению обычно доступно только
2Гб, различные блоки регистров, а также наборы ухищрений типа блока предсказания переходов,
которые должны повысить производительность системы без повышения такого абстрактного
параметра как частота процессора [1].

Современные задачи для персональных компьютеров по памяти уже подходят к 2Гб, а повышение
частоты процессоров не приводит к повышению производительности.

Решением проблемы ограничений современных 32-битных машин в какой-то степени стало
появление 64-битных архитектур SPARC64 и Intel Itanium. Однако они предназначены для hi-end
систем и недоступны в качестве дешевых решений. По настоящему массовыми предназначено
стать архитектуре AMD64 компании AMD и ее реализации EM64T компании Intel. Эти архитектуры
являются близнецами и программы, скомпилированные для одной из них, запускаются и на
другой. Однако исторически первой появилось именно решение от AMD. EM64T является всего
лишь фактически реализацией AMD64 от Intel. Архитектура AMD64 в настоящее время
реализована в процессорах всех классов: мобильных, рабочих станциях, серверах.

Несмотря на явные преимущества платформы AMD64 (о которых подробно говорится в
представленной статье), ничего революционно нового в вычислительной технике она не несет.
Переход от 32-х бит к 64-м не привел к качественным улучшениям, в то время как прошлый
подобный переход от 16-ти к 32-битам заметно повысил надежность и производительность
систем.
1. Архитектура AMD64
Архитектура AMD64 полностью описывается в пяти томах документации, предоставляемой
компанией AMD. В этой главе представлен краткий обзор, основанный на первом томе [2].
Обратим внимание на то, что в официальной документации данная архитектура обозначается как
AMD x86-64, что подчеркивает ее обратную совместимость.

1.1. Описание архитектуры
Архитектура AMD x86-64 простое, но в то же время мощное обратно-совместимое расширение
устаревшей промышленной архитектуры x86 [1]. Она добавляет 64-битное адресное пространство
и расширяет регистровые ресурсы для поддержки большей производительности для
перекомпилированных 64-битных программ, обеспечивая поддержку устаревшего 16-битного и
32-битного кода приложений и операционных систем без их модификации или перекомпиляции.

Необходимость 64-битной x86 архитектуры определяется приложениями, которым необходимо
большое адресное пространство. Это высокопроизводительные серверы, системы управления
базами данных, CAD-системы и конечно игры. Такие приложения получат преимущество от 64-
битного адресного пространства и увеличения количества регистров. Малое количество
регистров, доступное в устаревшей x86 архитектуре ограничивает производительность в
вычислительных задачах. Увеличенное количество регистров обеспечивает достаточную
производительность для многих приложений.

Архитектура x86-64 вводит две новые особенности:

1. расширенные регистры (рисунок 1):

   •   8 регистров общего назначения (general-purpose registers);
   •   все 16 регистров общего назначения 64-битные;
   •   8 новых 128-битных XMM регистров;
   •   новый командный префикс (REX) для доступа к расширенным регистрам.

2. специальный режим "Long Mode" (устоявшегося перевода пока нет), который представлен в
таблице 1:

   •   до 64-бит виртуальных адресов;
   •   64-битные указатель команд (RIP);
   •   плоское (flat) адресное пространство.
Рисунок 1. Набор регистров x86-64
Таблица 1. Режимы работы процессора

Таблица 2 содержит сравнение ресурсов регистров и стека, доступных приложению в различных
режимах. Левые колонки показывают ресурсы устаревшей x86 архитектуры, которые доступны
только для совместимости. Правые колонки показывают ресурсы доступные в 64
                                                                         64-битном режиме.
Серым цветом показано отличие между режимами.
Таблица 2. Регистры и стек, доступные в различных режимах
                                             доступные

Как показано в таблице 2, устаревшая архитектура x86 (такой режим называется legacy mode в x86
                                                                                             x86-
64) поддерживает 8 регистров общего назначения. Однако в действительности, в основном,
используются лишь 4 регистра EAX, EBX, ECX, EDX. Регистры EBP, ESI, EDI, ESP имеют специальное
назначение. Архитектура x86 64 добавляет 8 новых регистров общего назначения и увеличивает
                         x86-64
размер регистров с 32-х до 64 х бит. Это позволяет компиляторам повышать производительность
                      х    64-х
кода. 64-битный компилятор может лучше использовать регистры для хранения переменных.
                         тор
Компилятор также может минимизировать обращения к памяти, локализуя работу внутри
регистров общего назначения.
Архитектура x86-64 поддерживает весь набор инструкций x86 и добавляет некоторые новые
инструкции для поддержки long-режима. Команды разбиты на несколько подмножеств:

   •   Команды общего назначения. Это основные x86 целочисленные команды, используемые
       во всех программах. Большинство из них предназначены для загрузки, сохранения,
       обработки данных, расположенных в регистрах общего назначения или памяти.
       Некоторые из этих инструкций управляют потоком команд, обеспечивая переход к
       другому месту в программе.
   •   128-битные медиа-команды. Это SSE и SSE2 (streaming SIMD extension) команды,
       предназначенные для загрузки, сохранения, или обработки данных, расположенных в 128-
       битных XMM регистрах. Они выполняют целочисленные или с плавающей точкой
       операции над векторными (упакованными) и скалярными типами данных. Поскольку
       векторные инструкции могут независимо выполнять одну операцию над множеством
       данных, они называются single-instruction, multiple-data (SIMD) командами. Они
       используются для медиа- и научных приложений для обработки блоков данных.
   •   64-битные медиа-команды. Это multimedia extension (MMX) и 3DNow! команды. Они
       сохраняют, восстанавливают и обрабатывают данные, расположенные в 64-битных MMX
       регистрах. Подобно их 128-битным аналогам, описанным выше, они выполняют
       целочисленные и с плавающей точкой операции надо векторными (упакованными) и
       скалярными данными.
   •   x87 команды. Предназначены для работы с плавающей точкой в старых x87 приложениях.
       Обрабатывают данные в x87 регистрах.

Некоторые из этих команд соединяют два или более подмножества описанных выше команд.
Например, это команды пересылки данных между регистрами общего назначения и XMM или
MMX регистрами.

Рассмотрим более подробно представленные в таблице 1 режимы работы, поддерживаемые
архитектурой x86-64. В большинстве случаев размеры адресов и операндов могут быть перекрыты
префиксом команды.

Сначала опишем long-режим. Это расширение устаревшего защищенного (protected) режима.
Long-режим состоит из двух подвидов: 64-битный режим и режим совместимости. 64-битный
режим поддерживает все новые возможности и регистровые расширения, введенные в x86-64.
Режим совместимости поддерживает бинарную совместимость с существующим 16-битным и 32-
битным кодом. Long-режим не поддерживает устаревший реальный (real) режим или устаревший
виртуальный (virtual-8086) режим, а также не поддерживает аппаратное переключение задач.

Поскольку 64-битный режим поддерживает 64-битное адресное пространство, то для его работы
необходимо использовать новую 64-битную операционную систему. Существующие приложения
при этом могут запускаться без перекомпиляции в режиме совместимости под операционной
системой, работающей в 64-битном режиме. Для 64-битной адресации команд используется 64-
битный регистр (RIP) и новый режим адресации c единым плоским (flat) адресным пространством
и единым пространством для кода, стека и данных.

64-битный режим реализует поддержку расширенных регистров через новую группу префиксов
команд REX.
В 64-битном режиме размер адресов по умолчанию 64 бита, однако реализации x86-64 могут
иметь меньший размер. Размер операнда по умолчанию 32 бита. Для большинства инструкций
размер операнда по умолчанию может быть перекрыт с использованием префикса команд типа
REX.

64-битный режим обеспечивает адресацию данных относительно 64-битного регистра RIP. x86
архитектура обеспечивала адресацию относительно IP регистра только в командах передачи
управления. RIP-относительная адресация повышает эффективность позиционно-независимого
кода и кода, который адресует глобальные данные.

Несколько кодов операций (opcode) команд были переопределены для поддержки расширенных
регистров и 64-битной адресации.

Режим совместимости предназначен для выполнения в 64-битной операционной системе
существующих 16-битных и 32-битных программ. Приложения запускаются в режиме
совместимости с использованием 32- или 16-битного адресного пространства и могут иметь
доступ к 4Гб виртуального адресного пространства. Префиксы команд могут переключать 16- и 32-
битные адреса и размеры операндов.

С точки зрения приложения, режим совместимости выглядит как устаревший защищенный режим
x86, однако с точки зрения операционной системы (трансляция адресов, обработки прерываний и
исключений) используются 64-битные механизмы.

Устаревший (legacy) режим обеспечивает бинарную совместимость не только с 16- и 32-битными
приложениями, но и с 16- и 32-битными операционными системами. Он включает в себя три
режима:

   •   Защищенный (protected) режим. Поддерживаются 16- и 32-битные программы с
       сегментной организацией памяти, поддержкой привилегий и виртуальной памяти.
       Адресное пространство - 4Гб.
   •   Виртуальный (virtual-8086) режим. Поддерживает 16-битные приложения, запускаемые
       как задачи в защищенном режиме. Адресное пространство - 1Мб.
   •   Реальный (real) режим. Поддерживает 16-битные программы с простой регистровой
       адресацией сегментированной памяти. Не поддерживается виртуальная память или
       привилегии. Доступно 1Мб памяти.

Устаревший (legacy) режим используется только при работе 16- и 32-битных операционных
систем.

1.2. Достоинства архитектуры
Подчеркнем основные достоинства архитектуры AMD x86-64:

   •   64-битное адресное пространство.
   •   Расширенный набор регистров.
   •   Привычный для разработчиков набор команд.
   •   Возможность запуска старых 32-битных приложений в 64-битной операционной системе.
   •   Возможность использования 32-битных операционных систем.
1.3. Недостатки архитектуры
Серьезных недостатков в 32-битную архитектуру новая архитектура AMD x86-64 не внесла.
Отметить можно разве лишь чуть большие требования программ к памяти из-за того, что
увеличился размер адресов и операндов. Однако это серьезно не скажется ни на размере кода,
ни на требованиях к объему доступной оперативной памяти.

Но фактом является и то, что AMD x86-64 не привнесла ничего существенно нового. Нет
принципиального повышения производительности. В среднем после перекомпиляции программы
можно ожидать прирост производительности в пределах 5-15%.


2. Программная модель AMD64
Практически все современные операционные системы сейчас имеют версии для архитектуры
AMD64. Так Microsoft предоставляет Windows XP 64bit, Windows Server 2003 64bit, Windows Vista
64bit. Крупнейшие разработчики UNIX систем также поставляют 64-битные версии, как например
Linux Debian 3.1 x86-64. Однако это не означает, что весь код такой системы является полностью
64-битным. Часть кода ОС и многие приложения вполне могут оставаться 32-битными, т.к. AMD64
обеспечивает обратную совместимость.

64-битная версия Windows, к примеру, использует специальный режим WoW (Windows-on-
Windows 64), который транслирует вызовы 32-битных приложений к ресурсам 64-битной
операционной системы. Рассмотрим более подробно программную модель AMD64, доступную
программисту в 64-битной системе Windows [3, 4], для краткости называемой Win64.

Начнем с адресного пространства. Хотя 64-битный процессор теоретически может адресовать 16
экзабайт памяти (2^64), Win64 в настоящий момент поддерживает 16 терабайт (2^44). Этому есть
несколько причин. Текущие процессоры могут обеспечивать доступ лишь к 1 терабайту (2^40)
физической памяти. Архитектура (но не аппаратная часть) может расширить это пространство до 4
петабайт (2^52). Однако в любом случае, необходимо огромное количество памяти для
страничных таблиц, отображающих память (см. таблицу 3).

                             32-битный режим          64-битный режим
Общее адресное               4Гб                      16Тб
пространство процесса
Адресное пространство,      2Гб (3Гб, если система    4Гб, если приложение скомпилировано с
доступное 32-битному        загружена с ключом        ключом /LARGEADDRESSAWARE (2Гб
процессу                    /3GB)                     иначе)
Адресное пространство,      Невозможно                8Тб
доступное 64-битному
процессу
Нерезидентный пул (paged    470Мб                     128Гб
pool)
Резидентный пул (non-       256Мб                     128Гб
paged pool)
System Page Table (PTE)     660Мб - 900Мб             128Гб
Таблица 3. Основные ограничения памяти в Windows

Как и в Win32, адресуемый диапазон памяти делится на пользовательские адреса и на системные.
Каждый процесс получает 8Тб и 8Тб остается системе (в отличие от 2Гб и 2Гб в Win32
соответственно). Различные версии Windows имеют различные ограничения, представленные в
таблице 4.

Физическая память и количество процессоров 32-битные модели         64-битные модели
Windows XP Home                             4 Гбайт, 1 CPU          Не существует
Windows XP Professional                     4 Гбайт, 1-2 CPU        128 Гбайт, 1-2 CPU
Windows Server 2003, Standard               4 Гбайт, 1-4 CPU        32 Гбайт, 1-4 CPU
Windows Server 2003, Enterprise             64 Гбайт, 1-8 CPU       1 Тбайт, 1-8 CPU
Windows Server 2003, Datacenter             64 Гбайт, 8-32 CPU      1 Тбайт, 8-64 CPU
Windows Server 2008, Datacenter             64 Гбайт, 2-64 CPU      2 Тбайт, 2-64 CPU
Windows Server 2008, Enterprise             64 Гбайт, 1-8 CPU       2 Тбайт, 1-8 CPU
Windows Server 2008, Standard               4 Гбайт, 1-4 CPU        32 Гбайт, 1-4 CPU
Windows Server 2008, Web Server             4 Гбайт, 1-4 CPU        32 Гбайт, 1-4 CPU
Vista Home Basic                            4 Гбайт, 1 CPU          8 Гбайт, 1 CPU
Vista Home Premium                          4 Гбайт, 1-2 CPU        16 Гбайт, 1-2 CPU
Vista Business                              4 Гбайт, 1-2 CPU        128 Гбайт, 1-2 CPU
Vista Enterprise                            4 Гбайт, 1-2 CPU        128 Гбайт, 1-2 CPU
Vista Ultimate                              4 Гбайт, 1-2 CPU        128 Гбайт, 1-2 CPU
Таблица 4.Ограничения различных версий Windows.

Также как и в Win32 размер страницы составляет 4Кб. Первые 64Кб адресного пространства
никогда не отображаются, т.е. наименьший правильный адрес это 0x10000. В отличие от Win32,
системные DLL загружаются выше 4Гб.

Все процессоры, реализующие AMD64, имеют поддержку для "CPU No Execution" бита, который
Windows использует для реализации аппаратной технологии "Data Execution Protection" (DEP),
которая запрещает исполнение пользовательских данных вместо кода. Это позволяет повысить
надежность программ, исключая влияние ошибок типа выполнения буфера с данными как кода.

Особенность компиляторов для AMD64 в том, что они могут наиболее эффективно использовать
регистры для передачи параметров в функции, вместо использования стека. Это позволило
разработчикам Win64 архитектуры избавиться от такого понятия как соглашение о вызовах (calling
convention). В Win32 можно использовать разные соглашения (способы передачи параметров):
__stdcall, __cdecl, __fastcall и т.д. В Win64 есть только одно соглашение о вызовах. Рассмотрим
пример, как передаются в регистрах четыре аргумента типа integer:

   •   RCX: первый аргумент
   •   RDX: второй аргумент
   •   R8: третий аргумент
   •   R9: четвертый аргумент

Аргументы после первых четырех integer передаются на стеке. Для float аргументов используются
XMM0-XMM3 регистры, а также стек.

Разница в соглашениях о вызове приводит к тому, что в одной программе нельзя использовать и
64-битный, и 32-битный код. Другими словами, если приложение скомпилировано для 64-битного
режима, то все используемые библиотеки (DLL) также должны быть 64-битными.

При написании 64-битного кода можно получить дополнительный выигрыш в
производительности за счет специальной оптимизации. Подробно этот вопрос рассмотрен в
руководстве по оптимизации [5].
3. Перенос приложений на AMD64
Одним из назначений языков высокого уровня является по возможности сократить привязку
программного кода к архитектуре и обеспечить максимально возможную переносимость между
аппаратными платформами. Например, правильно написанные программы на языке Си++
теоретически не зависят от аппаратной платформы. И для компиляции существующих 32-битный
приложений под платформу AMD64 в идеале достаточно просто сменить компилятор [6] и просто
перекомпилировать программу. Но на практике дела обстоят более сложно.

До сих пор существует программное обеспечение, использующий ассемблерный код для 32-
битных процессоров. Многие программы, написанные на языках высокого уровня, содержат
ассемблерные вставки. Поэтому просто перекомпилировать большой проект часто бывает
невозможно. Решение проблемы понятно. Во-первых, можно отказаться от переноса приложения
на новую платформу. Это может быть весьма разумным решением, так как, например
операционные системы семейства Windows обеспечивают хорошую обратную совместимость,
благодаря технологии Wow64. Второй вариант - переписать программный код. Причем разумным
выглядит его переписывание с использованием языков высокого уровня. Кстати заметим, что
компилятор Visual C++ более не поддерживает компиляцию ассемблерных вставок в 64-битном
режиме компиляции [7].

Наличие ассемблерного программного кода не единственное препятствие при освоении 64-
битных систем. При переносе программ на 64-битные системы возникают разнообразные ошибки,
связанные с изменением модели данных (размерности типов). Причем ряд ошибок проявляет
себя только при использовании большого объема памяти, который был не доступен на 32-битных
системах. Подобные ошибки хорошо описаны в статье "20 ловушек переноса Си++ - кода на 64-
битную платформу" [8].

Сказанное выше относится больше к приложениям, разработанным на языке Си/Си++. С
управляемым кодом (C#) дела обстоят лучше, хотя и здесь можно ожидать мелких неполадок. К
сожалению, большие программные комплексы часто строятся с использованием библиотек,
созданных на языках Си/Си++. И поэтому в случае крупного проекта, написанного на C#, скорее
всего найдутся модули или библиотеки на языке Си/Си++, которые могут быть небезопасны и
содержать уязвимости.

Для тестирования и проверки программного кода, переносимого на 64-битную платформу можно
использовать различные специальные методики и инструменты [9]. Например, хорошие
результаты дает использование статических анализаторов, таких как Viva64 (для Windows систем)
и PC-Lint (для Unix систем). Более подробно с этим инструментарием можно познакомиться в
статье "Сравнение диагностических возможностей анализаторов при проверке 64-битного кода"
[10].


Заключение
Предложенная компанией AMD архитектура AMD64 несомненно оказалась востребованной на
рынке. Достоинство AMD64 в том, что она позволяет плавно перейти на 64-битные программы,
при этом не теряя совместимости со старыми 32-битными приложениями. Однако ничего
революционного в AMD64 нет.

Миграция 32-битных программ на AMD64, как показывают эксперименты, позволяет, во-первых,
решать задачи, существенно более требовательные к памяти, а, во-вторых, получить порядка 10%
прироста производительности "просто так", без изменения кода, за счет оптимизации
компилятором приложения под новую архитектуру.

Можно сделать вывод, что архитектура AMD64 намного лет отодвинула проблему ограничения
доступного объема оперативной памяти, но не решила проблем роста производительности
современных персональных машин. Будущее остается за многоядерными и многопроцессорными
системами.


Библиографический список
   1. Intel Software Developer's Manual. Volume 1: Basic Architecture.
       http://www.viva64.com/go.php?url=212
   2. AMD x86-64 Architecture Programmer's Manual. Volume 1: Application Programming.
       http://www.viva64.com/go.php?url=213
   3. Mike Wall. Tricks for Porting Applications to 64-Bit Windows on AMD64 Architecture.
       http://www.viva64.com/go.php?url=214
   4. Matt Pietrek. Everything You Need To Know To Start Programming 64-Bit Windows Systems.
       http://www.viva64.com/go.php?url=215
   5. Software Optimization Guide for AMD Athlon 64 and AMD Opteron Processors.
       http://www.viva64.com/go.php?url=59
   6. Compiler Usage Guidelines for 64-Bit Operating Systems on AMD64 Platforms.
       http://www.viva64.com/go.php?url=216
   7. Daniel Pistelli. Moving to Windows Vista x64. http://www.viva64.com/go.php?url=217
   8. Андрей Карпов, Евгений Рыжков. 20 ловушек переноса Си++ - кода на 64-битную
       платформу. http://www.viva64.com/art-1-1-1958348565.html
   9. Андрей Карпов. Проблемы тестирования 64-битных приложений.
       http://www.viva64.com/art-1-1-929024801.html
   10. Андрей Карпов. Сравнение диагностических возможностей анализаторов при проверке 64-
       битного кода. http://www.viva64.com/art-1-1-1441719613.html

More Related Content

What's hot

Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и систем
pianist2317
 
44
4444
44
JIuc
 
030
030030
030
JIuc
 
027
027027
027
JIuc
 
029
029029
029
JIuc
 
033
033033
033
JIuc
 

What's hot (20)

Процессор
ПроцессорПроцессор
Процессор
 
Лекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и системЛекция №5 Организация ЭВМ и систем
Лекция №5 Организация ЭВМ и систем
 
[DD] 10. Memory
[DD] 10. Memory[DD] 10. Memory
[DD] 10. Memory
 
Лекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и системЛекция № 2 Организация ЭВМ и систем
Лекция № 2 Организация ЭВМ и систем
 
Лекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и системЛекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и систем
 
64 бита
64 бита64 бита
64 бита
 
Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и систем
 
supercluster
superclustersupercluster
supercluster
 
Лекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и системЛекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и систем
 
Процессор
ПроцессорПроцессор
Процессор
 
44
4444
44
 
030
030030
030
 
027
027027
027
 
«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...
 
029
029029
029
 
История развития Операционных Систем
История развития Операционных СистемИстория развития Операционных Систем
История развития Операционных Систем
 
1.stm32 core flash rcc
1.stm32 core flash rcc1.stm32 core flash rcc
1.stm32 core flash rcc
 
033
033033
033
 
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
 
4
44
4
 

Similar to Архитектура AMD64 (EM64T)

034
034034
034
JIuc
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессов
student_SSGA
 
Аппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютераАппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютера
student_SSGA
 
Лекция №4(часть 1) Организация ЭВМ и систем
Лекция №4(часть 1) Организация ЭВМ и системЛекция №4(часть 1) Организация ЭВМ и систем
Лекция №4(часть 1) Организация ЭВМ и систем
pianist2317
 
023
023023
023
JIuc
 
ARM vs Intel microarchitecture
ARM vs Intel microarchitectureARM vs Intel microarchitecture
ARM vs Intel microarchitecture
Ilya Kryukov
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
Technopark
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Mikhail Kurnosov
 
Scalablehw Лагунцов
Scalablehw ЛагунцовScalablehw Лагунцов
Scalablehw Лагунцов
Ontico
 

Similar to Архитектура AMD64 (EM64T) (20)

034
034034
034
 
prezlec_Історія.ppt
prezlec_Історія.pptprezlec_Історія.ppt
prezlec_Історія.ppt
 
Оптимизация 64-битных программ
Оптимизация 64-битных программОптимизация 64-битных программ
Оптимизация 64-битных программ
 
06. Память Cortex-M3(4)
06. Память Cortex-M3(4)06. Память Cortex-M3(4)
06. Память Cortex-M3(4)
 
Особенности разработки 64-битных приложений
Особенности разработки 64-битных приложенийОсобенности разработки 64-битных приложений
Особенности разработки 64-битных приложений
 
Лекция №4 Организация ЭВМ и систем (продолжение)
Лекция №4 Организация ЭВМ и систем (продолжение)Лекция №4 Организация ЭВМ и систем (продолжение)
Лекция №4 Организация ЭВМ и систем (продолжение)
 
Обзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектурОбзор современных микроконтроллеров и их архитектур
Обзор современных микроконтроллеров и их архитектур
 
СКАЛА-Р. Российская конвергентная вычислительная платформа
СКАЛА-Р. Российская конвергентная вычислительная платформаСКАЛА-Р. Российская конвергентная вычислительная платформа
СКАЛА-Р. Российская конвергентная вычислительная платформа
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессов
 
Аппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютераАппаратная реализация персонального компьютера
Аппаратная реализация персонального компьютера
 
Лекция №4(часть 1) Организация ЭВМ и систем
Лекция №4(часть 1) Организация ЭВМ и системЛекция №4(часть 1) Организация ЭВМ и систем
Лекция №4(часть 1) Организация ЭВМ и систем
 
023
023023
023
 
ARM vs Intel microarchitecture
ARM vs Intel microarchitectureARM vs Intel microarchitecture
ARM vs Intel microarchitecture
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
дәріс №8
дәріс №8дәріс №8
дәріс №8
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...Разработка статического анализатора кода для обнаружения ошибок переноса прог...
Разработка статического анализатора кода для обнаружения ошибок переноса прог...
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
 
Scalablehw Лагунцов
Scalablehw ЛагунцовScalablehw Лагунцов
Scalablehw Лагунцов
 

More from Tatyanazaxarova

More from Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 

Архитектура AMD64 (EM64T)

  • 1. Архитектура AMD64 (EM64T) Авторы: Евгений Рыжков, Андрей Карпов Дата: 02.10.2008 Аннотация В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки. Введение Развитие задач, решаемых с помощью вычислительной техники, постоянно повышает требования к аппаратуре, на которой эти задачи решаются. Требования к вычислительным системам класса персональных компьютеров увеличиваются уже более 20 лет год от года. Это происходит из-за желания людей решать на персональных компьютерах все более сложные задачи, которые ранее решались лишь на высокопроизводительных мэйнфреймах. Какие же требования возникают к персональным компьютерам для решения сложных задач? Разумеется, это требования по объему оперативной памяти и быстродействию процессора (не путать с частотой!). Господствующая последнее десятилетие архитектура IA32 (Intel Architecture 32) предлагает 4Гб (2^32) оперативной памяти, из которой приложению обычно доступно только 2Гб, различные блоки регистров, а также наборы ухищрений типа блока предсказания переходов, которые должны повысить производительность системы без повышения такого абстрактного параметра как частота процессора [1]. Современные задачи для персональных компьютеров по памяти уже подходят к 2Гб, а повышение частоты процессоров не приводит к повышению производительности. Решением проблемы ограничений современных 32-битных машин в какой-то степени стало появление 64-битных архитектур SPARC64 и Intel Itanium. Однако они предназначены для hi-end систем и недоступны в качестве дешевых решений. По настоящему массовыми предназначено стать архитектуре AMD64 компании AMD и ее реализации EM64T компании Intel. Эти архитектуры являются близнецами и программы, скомпилированные для одной из них, запускаются и на другой. Однако исторически первой появилось именно решение от AMD. EM64T является всего лишь фактически реализацией AMD64 от Intel. Архитектура AMD64 в настоящее время реализована в процессорах всех классов: мобильных, рабочих станциях, серверах. Несмотря на явные преимущества платформы AMD64 (о которых подробно говорится в представленной статье), ничего революционно нового в вычислительной технике она не несет. Переход от 32-х бит к 64-м не привел к качественным улучшениям, в то время как прошлый подобный переход от 16-ти к 32-битам заметно повысил надежность и производительность систем.
  • 2. 1. Архитектура AMD64 Архитектура AMD64 полностью описывается в пяти томах документации, предоставляемой компанией AMD. В этой главе представлен краткий обзор, основанный на первом томе [2]. Обратим внимание на то, что в официальной документации данная архитектура обозначается как AMD x86-64, что подчеркивает ее обратную совместимость. 1.1. Описание архитектуры Архитектура AMD x86-64 простое, но в то же время мощное обратно-совместимое расширение устаревшей промышленной архитектуры x86 [1]. Она добавляет 64-битное адресное пространство и расширяет регистровые ресурсы для поддержки большей производительности для перекомпилированных 64-битных программ, обеспечивая поддержку устаревшего 16-битного и 32-битного кода приложений и операционных систем без их модификации или перекомпиляции. Необходимость 64-битной x86 архитектуры определяется приложениями, которым необходимо большое адресное пространство. Это высокопроизводительные серверы, системы управления базами данных, CAD-системы и конечно игры. Такие приложения получат преимущество от 64- битного адресного пространства и увеличения количества регистров. Малое количество регистров, доступное в устаревшей x86 архитектуре ограничивает производительность в вычислительных задачах. Увеличенное количество регистров обеспечивает достаточную производительность для многих приложений. Архитектура x86-64 вводит две новые особенности: 1. расширенные регистры (рисунок 1): • 8 регистров общего назначения (general-purpose registers); • все 16 регистров общего назначения 64-битные; • 8 новых 128-битных XMM регистров; • новый командный префикс (REX) для доступа к расширенным регистрам. 2. специальный режим "Long Mode" (устоявшегося перевода пока нет), который представлен в таблице 1: • до 64-бит виртуальных адресов; • 64-битные указатель команд (RIP); • плоское (flat) адресное пространство.
  • 3.
  • 4. Рисунок 1. Набор регистров x86-64
  • 5. Таблица 1. Режимы работы процессора Таблица 2 содержит сравнение ресурсов регистров и стека, доступных приложению в различных режимах. Левые колонки показывают ресурсы устаревшей x86 архитектуры, которые доступны только для совместимости. Правые колонки показывают ресурсы доступные в 64 64-битном режиме. Серым цветом показано отличие между режимами.
  • 6. Таблица 2. Регистры и стек, доступные в различных режимах доступные Как показано в таблице 2, устаревшая архитектура x86 (такой режим называется legacy mode в x86 x86- 64) поддерживает 8 регистров общего назначения. Однако в действительности, в основном, используются лишь 4 регистра EAX, EBX, ECX, EDX. Регистры EBP, ESI, EDI, ESP имеют специальное назначение. Архитектура x86 64 добавляет 8 новых регистров общего назначения и увеличивает x86-64 размер регистров с 32-х до 64 х бит. Это позволяет компиляторам повышать производительность х 64-х кода. 64-битный компилятор может лучше использовать регистры для хранения переменных. тор Компилятор также может минимизировать обращения к памяти, локализуя работу внутри регистров общего назначения.
  • 7. Архитектура x86-64 поддерживает весь набор инструкций x86 и добавляет некоторые новые инструкции для поддержки long-режима. Команды разбиты на несколько подмножеств: • Команды общего назначения. Это основные x86 целочисленные команды, используемые во всех программах. Большинство из них предназначены для загрузки, сохранения, обработки данных, расположенных в регистрах общего назначения или памяти. Некоторые из этих инструкций управляют потоком команд, обеспечивая переход к другому месту в программе. • 128-битные медиа-команды. Это SSE и SSE2 (streaming SIMD extension) команды, предназначенные для загрузки, сохранения, или обработки данных, расположенных в 128- битных XMM регистрах. Они выполняют целочисленные или с плавающей точкой операции над векторными (упакованными) и скалярными типами данных. Поскольку векторные инструкции могут независимо выполнять одну операцию над множеством данных, они называются single-instruction, multiple-data (SIMD) командами. Они используются для медиа- и научных приложений для обработки блоков данных. • 64-битные медиа-команды. Это multimedia extension (MMX) и 3DNow! команды. Они сохраняют, восстанавливают и обрабатывают данные, расположенные в 64-битных MMX регистрах. Подобно их 128-битным аналогам, описанным выше, они выполняют целочисленные и с плавающей точкой операции надо векторными (упакованными) и скалярными данными. • x87 команды. Предназначены для работы с плавающей точкой в старых x87 приложениях. Обрабатывают данные в x87 регистрах. Некоторые из этих команд соединяют два или более подмножества описанных выше команд. Например, это команды пересылки данных между регистрами общего назначения и XMM или MMX регистрами. Рассмотрим более подробно представленные в таблице 1 режимы работы, поддерживаемые архитектурой x86-64. В большинстве случаев размеры адресов и операндов могут быть перекрыты префиксом команды. Сначала опишем long-режим. Это расширение устаревшего защищенного (protected) режима. Long-режим состоит из двух подвидов: 64-битный режим и режим совместимости. 64-битный режим поддерживает все новые возможности и регистровые расширения, введенные в x86-64. Режим совместимости поддерживает бинарную совместимость с существующим 16-битным и 32- битным кодом. Long-режим не поддерживает устаревший реальный (real) режим или устаревший виртуальный (virtual-8086) режим, а также не поддерживает аппаратное переключение задач. Поскольку 64-битный режим поддерживает 64-битное адресное пространство, то для его работы необходимо использовать новую 64-битную операционную систему. Существующие приложения при этом могут запускаться без перекомпиляции в режиме совместимости под операционной системой, работающей в 64-битном режиме. Для 64-битной адресации команд используется 64- битный регистр (RIP) и новый режим адресации c единым плоским (flat) адресным пространством и единым пространством для кода, стека и данных. 64-битный режим реализует поддержку расширенных регистров через новую группу префиксов команд REX.
  • 8. В 64-битном режиме размер адресов по умолчанию 64 бита, однако реализации x86-64 могут иметь меньший размер. Размер операнда по умолчанию 32 бита. Для большинства инструкций размер операнда по умолчанию может быть перекрыт с использованием префикса команд типа REX. 64-битный режим обеспечивает адресацию данных относительно 64-битного регистра RIP. x86 архитектура обеспечивала адресацию относительно IP регистра только в командах передачи управления. RIP-относительная адресация повышает эффективность позиционно-независимого кода и кода, который адресует глобальные данные. Несколько кодов операций (opcode) команд были переопределены для поддержки расширенных регистров и 64-битной адресации. Режим совместимости предназначен для выполнения в 64-битной операционной системе существующих 16-битных и 32-битных программ. Приложения запускаются в режиме совместимости с использованием 32- или 16-битного адресного пространства и могут иметь доступ к 4Гб виртуального адресного пространства. Префиксы команд могут переключать 16- и 32- битные адреса и размеры операндов. С точки зрения приложения, режим совместимости выглядит как устаревший защищенный режим x86, однако с точки зрения операционной системы (трансляция адресов, обработки прерываний и исключений) используются 64-битные механизмы. Устаревший (legacy) режим обеспечивает бинарную совместимость не только с 16- и 32-битными приложениями, но и с 16- и 32-битными операционными системами. Он включает в себя три режима: • Защищенный (protected) режим. Поддерживаются 16- и 32-битные программы с сегментной организацией памяти, поддержкой привилегий и виртуальной памяти. Адресное пространство - 4Гб. • Виртуальный (virtual-8086) режим. Поддерживает 16-битные приложения, запускаемые как задачи в защищенном режиме. Адресное пространство - 1Мб. • Реальный (real) режим. Поддерживает 16-битные программы с простой регистровой адресацией сегментированной памяти. Не поддерживается виртуальная память или привилегии. Доступно 1Мб памяти. Устаревший (legacy) режим используется только при работе 16- и 32-битных операционных систем. 1.2. Достоинства архитектуры Подчеркнем основные достоинства архитектуры AMD x86-64: • 64-битное адресное пространство. • Расширенный набор регистров. • Привычный для разработчиков набор команд. • Возможность запуска старых 32-битных приложений в 64-битной операционной системе. • Возможность использования 32-битных операционных систем.
  • 9. 1.3. Недостатки архитектуры Серьезных недостатков в 32-битную архитектуру новая архитектура AMD x86-64 не внесла. Отметить можно разве лишь чуть большие требования программ к памяти из-за того, что увеличился размер адресов и операндов. Однако это серьезно не скажется ни на размере кода, ни на требованиях к объему доступной оперативной памяти. Но фактом является и то, что AMD x86-64 не привнесла ничего существенно нового. Нет принципиального повышения производительности. В среднем после перекомпиляции программы можно ожидать прирост производительности в пределах 5-15%. 2. Программная модель AMD64 Практически все современные операционные системы сейчас имеют версии для архитектуры AMD64. Так Microsoft предоставляет Windows XP 64bit, Windows Server 2003 64bit, Windows Vista 64bit. Крупнейшие разработчики UNIX систем также поставляют 64-битные версии, как например Linux Debian 3.1 x86-64. Однако это не означает, что весь код такой системы является полностью 64-битным. Часть кода ОС и многие приложения вполне могут оставаться 32-битными, т.к. AMD64 обеспечивает обратную совместимость. 64-битная версия Windows, к примеру, использует специальный режим WoW (Windows-on- Windows 64), который транслирует вызовы 32-битных приложений к ресурсам 64-битной операционной системы. Рассмотрим более подробно программную модель AMD64, доступную программисту в 64-битной системе Windows [3, 4], для краткости называемой Win64. Начнем с адресного пространства. Хотя 64-битный процессор теоретически может адресовать 16 экзабайт памяти (2^64), Win64 в настоящий момент поддерживает 16 терабайт (2^44). Этому есть несколько причин. Текущие процессоры могут обеспечивать доступ лишь к 1 терабайту (2^40) физической памяти. Архитектура (но не аппаратная часть) может расширить это пространство до 4 петабайт (2^52). Однако в любом случае, необходимо огромное количество памяти для страничных таблиц, отображающих память (см. таблицу 3). 32-битный режим 64-битный режим Общее адресное 4Гб 16Тб пространство процесса Адресное пространство, 2Гб (3Гб, если система 4Гб, если приложение скомпилировано с доступное 32-битному загружена с ключом ключом /LARGEADDRESSAWARE (2Гб процессу /3GB) иначе) Адресное пространство, Невозможно 8Тб доступное 64-битному процессу Нерезидентный пул (paged 470Мб 128Гб pool) Резидентный пул (non- 256Мб 128Гб paged pool) System Page Table (PTE) 660Мб - 900Мб 128Гб Таблица 3. Основные ограничения памяти в Windows Как и в Win32, адресуемый диапазон памяти делится на пользовательские адреса и на системные. Каждый процесс получает 8Тб и 8Тб остается системе (в отличие от 2Гб и 2Гб в Win32
  • 10. соответственно). Различные версии Windows имеют различные ограничения, представленные в таблице 4. Физическая память и количество процессоров 32-битные модели 64-битные модели Windows XP Home 4 Гбайт, 1 CPU Не существует Windows XP Professional 4 Гбайт, 1-2 CPU 128 Гбайт, 1-2 CPU Windows Server 2003, Standard 4 Гбайт, 1-4 CPU 32 Гбайт, 1-4 CPU Windows Server 2003, Enterprise 64 Гбайт, 1-8 CPU 1 Тбайт, 1-8 CPU Windows Server 2003, Datacenter 64 Гбайт, 8-32 CPU 1 Тбайт, 8-64 CPU Windows Server 2008, Datacenter 64 Гбайт, 2-64 CPU 2 Тбайт, 2-64 CPU Windows Server 2008, Enterprise 64 Гбайт, 1-8 CPU 2 Тбайт, 1-8 CPU Windows Server 2008, Standard 4 Гбайт, 1-4 CPU 32 Гбайт, 1-4 CPU Windows Server 2008, Web Server 4 Гбайт, 1-4 CPU 32 Гбайт, 1-4 CPU Vista Home Basic 4 Гбайт, 1 CPU 8 Гбайт, 1 CPU Vista Home Premium 4 Гбайт, 1-2 CPU 16 Гбайт, 1-2 CPU Vista Business 4 Гбайт, 1-2 CPU 128 Гбайт, 1-2 CPU Vista Enterprise 4 Гбайт, 1-2 CPU 128 Гбайт, 1-2 CPU Vista Ultimate 4 Гбайт, 1-2 CPU 128 Гбайт, 1-2 CPU Таблица 4.Ограничения различных версий Windows. Также как и в Win32 размер страницы составляет 4Кб. Первые 64Кб адресного пространства никогда не отображаются, т.е. наименьший правильный адрес это 0x10000. В отличие от Win32, системные DLL загружаются выше 4Гб. Все процессоры, реализующие AMD64, имеют поддержку для "CPU No Execution" бита, который Windows использует для реализации аппаратной технологии "Data Execution Protection" (DEP), которая запрещает исполнение пользовательских данных вместо кода. Это позволяет повысить надежность программ, исключая влияние ошибок типа выполнения буфера с данными как кода. Особенность компиляторов для AMD64 в том, что они могут наиболее эффективно использовать регистры для передачи параметров в функции, вместо использования стека. Это позволило разработчикам Win64 архитектуры избавиться от такого понятия как соглашение о вызовах (calling convention). В Win32 можно использовать разные соглашения (способы передачи параметров): __stdcall, __cdecl, __fastcall и т.д. В Win64 есть только одно соглашение о вызовах. Рассмотрим пример, как передаются в регистрах четыре аргумента типа integer: • RCX: первый аргумент • RDX: второй аргумент • R8: третий аргумент • R9: четвертый аргумент Аргументы после первых четырех integer передаются на стеке. Для float аргументов используются XMM0-XMM3 регистры, а также стек. Разница в соглашениях о вызове приводит к тому, что в одной программе нельзя использовать и 64-битный, и 32-битный код. Другими словами, если приложение скомпилировано для 64-битного режима, то все используемые библиотеки (DLL) также должны быть 64-битными. При написании 64-битного кода можно получить дополнительный выигрыш в производительности за счет специальной оптимизации. Подробно этот вопрос рассмотрен в руководстве по оптимизации [5].
  • 11. 3. Перенос приложений на AMD64 Одним из назначений языков высокого уровня является по возможности сократить привязку программного кода к архитектуре и обеспечить максимально возможную переносимость между аппаратными платформами. Например, правильно написанные программы на языке Си++ теоретически не зависят от аппаратной платформы. И для компиляции существующих 32-битный приложений под платформу AMD64 в идеале достаточно просто сменить компилятор [6] и просто перекомпилировать программу. Но на практике дела обстоят более сложно. До сих пор существует программное обеспечение, использующий ассемблерный код для 32- битных процессоров. Многие программы, написанные на языках высокого уровня, содержат ассемблерные вставки. Поэтому просто перекомпилировать большой проект часто бывает невозможно. Решение проблемы понятно. Во-первых, можно отказаться от переноса приложения на новую платформу. Это может быть весьма разумным решением, так как, например операционные системы семейства Windows обеспечивают хорошую обратную совместимость, благодаря технологии Wow64. Второй вариант - переписать программный код. Причем разумным выглядит его переписывание с использованием языков высокого уровня. Кстати заметим, что компилятор Visual C++ более не поддерживает компиляцию ассемблерных вставок в 64-битном режиме компиляции [7]. Наличие ассемблерного программного кода не единственное препятствие при освоении 64- битных систем. При переносе программ на 64-битные системы возникают разнообразные ошибки, связанные с изменением модели данных (размерности типов). Причем ряд ошибок проявляет себя только при использовании большого объема памяти, который был не доступен на 32-битных системах. Подобные ошибки хорошо описаны в статье "20 ловушек переноса Си++ - кода на 64- битную платформу" [8]. Сказанное выше относится больше к приложениям, разработанным на языке Си/Си++. С управляемым кодом (C#) дела обстоят лучше, хотя и здесь можно ожидать мелких неполадок. К сожалению, большие программные комплексы часто строятся с использованием библиотек, созданных на языках Си/Си++. И поэтому в случае крупного проекта, написанного на C#, скорее всего найдутся модули или библиотеки на языке Си/Си++, которые могут быть небезопасны и содержать уязвимости. Для тестирования и проверки программного кода, переносимого на 64-битную платформу можно использовать различные специальные методики и инструменты [9]. Например, хорошие результаты дает использование статических анализаторов, таких как Viva64 (для Windows систем) и PC-Lint (для Unix систем). Более подробно с этим инструментарием можно познакомиться в статье "Сравнение диагностических возможностей анализаторов при проверке 64-битного кода" [10]. Заключение Предложенная компанией AMD архитектура AMD64 несомненно оказалась востребованной на рынке. Достоинство AMD64 в том, что она позволяет плавно перейти на 64-битные программы, при этом не теряя совместимости со старыми 32-битными приложениями. Однако ничего революционного в AMD64 нет. Миграция 32-битных программ на AMD64, как показывают эксперименты, позволяет, во-первых, решать задачи, существенно более требовательные к памяти, а, во-вторых, получить порядка 10%
  • 12. прироста производительности "просто так", без изменения кода, за счет оптимизации компилятором приложения под новую архитектуру. Можно сделать вывод, что архитектура AMD64 намного лет отодвинула проблему ограничения доступного объема оперативной памяти, но не решила проблем роста производительности современных персональных машин. Будущее остается за многоядерными и многопроцессорными системами. Библиографический список 1. Intel Software Developer's Manual. Volume 1: Basic Architecture. http://www.viva64.com/go.php?url=212 2. AMD x86-64 Architecture Programmer's Manual. Volume 1: Application Programming. http://www.viva64.com/go.php?url=213 3. Mike Wall. Tricks for Porting Applications to 64-Bit Windows on AMD64 Architecture. http://www.viva64.com/go.php?url=214 4. Matt Pietrek. Everything You Need To Know To Start Programming 64-Bit Windows Systems. http://www.viva64.com/go.php?url=215 5. Software Optimization Guide for AMD Athlon 64 and AMD Opteron Processors. http://www.viva64.com/go.php?url=59 6. Compiler Usage Guidelines for 64-Bit Operating Systems on AMD64 Platforms. http://www.viva64.com/go.php?url=216 7. Daniel Pistelli. Moving to Windows Vista x64. http://www.viva64.com/go.php?url=217 8. Андрей Карпов, Евгений Рыжков. 20 ловушек переноса Си++ - кода на 64-битную платформу. http://www.viva64.com/art-1-1-1958348565.html 9. Андрей Карпов. Проблемы тестирования 64-битных приложений. http://www.viva64.com/art-1-1-929024801.html 10. Андрей Карпов. Сравнение диагностических возможностей анализаторов при проверке 64- битного кода. http://www.viva64.com/art-1-1-1441719613.html