Архитектура x86 64
x86-64
x86-64 (x64/AMD64/Intel64/EM64T) — аппаратная платформа. Автором технологии является компания AMD. Платформа создана для выполнения 64-разрядных приложений.
Представляет собой расширение x86-архитектуры, обладает практически полной обратной совместимостью.
Компании Microsoft и Oracle применяют для индикации данного набора инструкций термин «x64», хотя каталог с файлами в дистрибутивах Linux имеет название «amd64» (в случае с архитектурой x86, именуется как «i386»).
На сегодняшний день, платформу x86-64 поддерживают следующие компании:
- AMD: процессоры Z-серии, C-серии, G-серии, E-серии, E1, E2, A4, A6, A8, A10, FX, Athlon 64, Athlon 64 FX, Athlon 64 X2, Athlon II, Phenom, Phenom II, Turion 64, Turion 64 X2, Turion II, Opteron, последние модели Sempron;
- Intel: реализует данную платформу, используя название «Intel 64» («EM64T» и «IA-32e»). Поздние модели процессоров Pentium 4, серии Pentium D, Pentium Extreme Edition, Celeron D, Celeron G-серии, Celeron B-серии, Pentium Dual-Core, Pentium T-серии, Pentium P-серии, Pentium G-серии, Pentium B-серии, Core 2 Duo, Core 2 Quad, Core 2 Extreme, Core i3, Core i5, Core i7, Atom и Xeon;
- VIA: Nano, Eden, QuadCore.
Название
Есть несколько вариаций названия данной технологии. Порой, противоречия в именовании платформы в каждой отдельной компании создают общую путаницу. Попробуем разобраться в терминологии:
- x86-64 — изначальный вариант названия, под которым компания AMD опубликовала первую предварительную спецификацию.
- x64 — название версий ОС Windows и Solaris. Используется в качестве названия для архитектуры компаний Microsoft и Sun Microsystems.
- AA-64(AMD Architecture 64) — название архитектуры, автором которого стал известный неофициальный справочник sandpile.org, по аналогии с IA-64.
- Hammer Architecture— название основывается на первых ядрах процессоров, поддерживавших данную архитектуру — Clawhammer и Sledgehammer.
- AMD64 — название технологии, данное фирмой-разработчиком — компанией AMD. Появилось после выпуска первых Clawhammer и Sledgehammer процессоров. На данный момент, является официальным названием для реализации от AMD.
- Yamhill Tehnology— первичное название аналогичной технологии от Intel. Порой также встречалось название CT (Clackamas Technology).
- EM64T(Extended Memory 64 Technology) — первое официальное название реализации Intel.
- IA-32e — название порой употреблялось вместе с EM64T. В основном, использовалось для обозначения «длинного» режима (в документации Intel именуется «режимом IA-32e»).
- Intel 64 — новое официальное название архитектуры Intel, использующееся в настоящее время. Intel потихоньку отходит от названий IA-32, IA-32e и EM64T, используя это. Теперь оно является единственным официальным названием данной архитектуры со стороны компании Intel.
В настоящее время, самыми распространенными названиями выступают: «x64», «x86-64» и «AMD64». Порой это путает AMD-пользователей — вплоть до отказа использования родных дистрибутивов ОС: пользователь не уверен, будет ли работать выбранная версия на AMD процессоре. На самом же деле, распространители программного обеспечения применяют название amd64 лишь для того, чтобы подчеркнуть, что именно компания AMD является новатором в разработке данной технологии.
Зачастую, пользователи сами путают архитектуру Intel 64 с IA-64. Важно помнить, что Intel 64 и IA-64 — совершенно разные, несовместимые между собой платформы:
- Представители Intel 64: последние версии Pentium 4, некоторые модели Celeron D, линейка Core 2, Core i3, Core i5, Core i7, некоторые модели Intel Atom;
- Представители IA-64: семейства Itanium и Itanium 2.
Режимы
Имеется два режима работы данной архитектуры:
- Long mode(«длинный» режим);
- Legacy mode(«наследственный» режим).
«Long Mode»
«Длинный» режим, будучи родным для AMD64, позволяет воспользоваться всеми дополнительными преимуществами архитектуры. Для активации данного режима требуется 64-битная ОС. К примеру, Windows 7 x64 или 64-битные версии UNIX-подобных систем (GNU/Linux, FreeBSD, OpenBSD, NetBSD, Solaris, Mac OS X — от версии 10.4.7 и выше).
Данный режим дает возможность работать 64-битным программам, кроме того, доступна и обратная совместимость: имеется поддержка 32-битного кода для работы 32-битных приложений. Но 32-битные программы не имеют возможности читать 64-битные системные библиотеки, а также — наоборот. Для того, чтобы побороть эти ограничения, большая часть 64-разрядных операционных систем предоставляет два набора необходимых системных файлов (для родных 64-битных приложений и для их 32-битных версий). Такая же методика применялась в ранних 32-битных системах (Windows 95) для запуска 16-битных программ.
«Длинный» режим не содержит в себе некоторые «рудименты» x86-архитектуры. Например, режим виртуального 8086, сегментированную модель памяти, аппаратную мультизадачность, и прочее.
«Длинный» режим имеет одну яркую особенность: его активация производится посредством установки флага CR0.PG. Он применяется для включения страничного MMU (если это переключение разрешено (EFER.LME=1). Если переключение недопустимо, включение MMU происходит в «наследственном» режиме.
Так, исполнение 64-битного кода с запрещенным страничным преобразованием невозможно, что приводит к определенным сложностям в программировании, ведь при переключении из «длинного» в «наследственный» режим (и обратно) необходим двойной сброс MMU. Для этого код переключения должен быть в тождественно отображенной странице.
«Legacy Mode»
Этот режим зовется «наследственным» по той причине, что дает возможность процессору AMD64 работать с инструкциями, которые рассчитаны для x86-процессоров. Кроме того, в рамках активации данного режима, осуществляется полная совместимость с 32-битным кодом и соответствующими ОС.
Процессор в «наследственном» режиме работает точно так же, как стандартный x86-процессор. Дополнительные функции, доступные под архитектурой AMD64, становятся неактивны.
При активации данного режима, 64-битные программы и соответствующие операционные системы функционировать не будут.
Особенности
Набор инструкций x86-64 (позже — AMD64), выпущенный компанией AMD — это расширение Intel IA-32 (x86-32). Ключевая отличительная черта AMD64 кроется в поддержке 64-битных регистров общего назначения, а также 64-битных арифметических/логических операций над целыми числами и 64-битных виртуальных адресов.
Чтобы осуществить адресацию регистров, для команд введены специальные «префиксы расширения регистра». Специально для них был выбран диапазон кодов 40h-4Fh, использующихся для команд INC и DEC в 32-битных режимах. Команды INC и DEC в 64-битном режиме кодируются в общей двухбайтовой форме.
Платформа x86-64 включает в себя:
- Шестнадцать целочисленных 64-битных регистра общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15);
- Восемь 80-битных регистров с плавающей точкой (ST0 — ST7);
- Восемь 64-битных регистров Multimedia Extensions (MM0 — MM7, общее пространство с регистрами ST0 — ST7);
- Шестнадцать 128-битных регистров SSE (XMM0 — XMM15);
- 64-битный указатель RIP и 64-битный регистр флагов RFLAGS.
Сегментирование
В ходе создания архитектуры x86-64, специалисты компании AMD пришли к решению окончательно покончить с главным «рудиментом» архитектуры x86 — сегментной моделью памяти. Она поддерживалась еще во времена 8086/80286.
При создании новой версии продукта виртуализации, программисты VMware обнаружили ряд непреодолимых трудностей. Загвоздки возникали в процессе реализации виртуальной машины для 64-битных систем. Чтобы отделить код монитора от кода «гостя», программа применяла механизм сегментации, но данная задача так и не была реализована на практике.
После ряда неудачных экспериментов, компания AMD возобновила ограниченный вариант сегментной организации памяти (начиная с ревизии D архитектуры AMD64). Это дало возможность запускать 64-битные операционные системы в виртуальных машинах. Компания Intel не стала следовать такому примеру. Чтобы осуществить проверку процессора на предмет возможности запуска 64-битных гостевых операционных систем, VMware снабжает продукты специальной утилитой.
Команды LAHF и SAHF, вырезанные изначально, были возвращены в систему команд из-за их активного использования в программном обеспечении виртуализации.
По мере развития средств аппаратной виртуализации (Intel VT, AMD-V), необходимость в сегментации постепенно утрачивается.
Десять имён для одной архитектуры
На пятничном семинаре учебного проекта лаборатории МФТИ-Интел один из студентов задал мне примерно такой вопрос: а почему 64-битный вариант архитектуры процессоров Intel называется x64, а 32-битный — x86? Я начал объяснять, что не всё так просто. Захотелось нарисовать более полную картину. Ведь на самом деле это не x64, и даже не x86.
386-ые, Пентиумы и Коры
На самом деле названий для этого феномена, около сорока лет присутствующего на сцене процессорных технологий, было придумано несколько. Даже больше, чем хотелось бы. Они появились из разных источников и используются в разных контекстах, разными компаниями и разными сообществами. Конечно же, это вносит некоторую неразбериху.
Я постарался здесь собрать все известные мне названия. Не хочу пытаться доказать, что одна группа имён лучше другой, — меньше использовать их не станут.
8086 и семейство
В 1978 году был выпущен 16-битный процессор Intel, который имел «имя» 8086. За ним были 8088, 80186, 80286, 80386 (плюс вариации), 80486 (плюс вариации). Легко заметить, что (почти) все эти числовые имена оканчиваются на две цифры 86, что дало название всей серии x86. Оно укрепилось, его продолжили использовать и после того, как процессорам перестали давать цифровые имена, а появились Intel Pentium, Celeron, Xeon, Core, Atom и т.д. Совместимые продукты других вендоров, таких как IBM, AMD, Cyrix, VIA и т.д., также описываются как x86.
По моим наблюдениям, x86 — самый популярный вариант для имени этой архитектуры в Интернете, статьях и прочей литературе, особенно, когда не стоит задачи точно специфицировать разрядность архитектуры или речь явным образом идёт о 32-битном варианте.
Используются также вариации этого названия для 32-битных вариантов, позволяющие более точно указать минимальный набор поддерживаемых инструкций: i386, i486, i586, i686, — например, для различения вариантов сборок бинарных пакетов дистрибутивов Linux.
Пришествие 64 бит
Своими стараниями Intel расширила машинное слово в описанной ранее серии процессоров с 16 до 32 бит. Достигнуть этой архитектуре 64 бит помогла компания AMD, в 2003 году представившая процессор, поддерживающий новые инструкции и регистры и реализующий AMD64.
Для того, чтобы явно указать повышенную битность процессора/кода/пакета, имя x86 стало получать новый суффикс «64». Вот только через какой знак его приписывать не договорились, и иногда видишь x86_64, а порой x86-64. Например, вывод команды uname в Linux использует подчерк. Наконец, у пакетов можно увидеть и суффикс amd64 строчными буквами.
Intel же обозначала это расширение архитектуры сперва IA-32e, затем EM64T. В настоящее время можно встретить оба варианта в различных именах пакетов, документации и прочем. Тем не менее, есть и третье введённое Intel название…
Как это называет Intel
В официальной документации 32-битная архитектура имеет имя IA-32; её 64-битный вариант получил довольно странное с моей точки зрения имя Intel 64. Почему странное — оно создаёт потенциал для путаницы, как мы увидим ближе к концу статьи.
Компании-поставщики софта
Если кому-то показалось, что у этой несчастной архитектуры как-то мало имён и суффиксов, то сейчас я обозначу ещё одно известное мне. Происходит оно от поставщиков программного обеспечения, которым как-то надо различать варианты поставляемых пакетов для 32 и 64 бит. Тут их мнения разделились примерно вот таким образом (подробнее — в Википедии).
- Дистибутивы Linux: x86 и x86_64, иногда x86 и amd64.
- Apple: x86 и x86_64.
- Microsoft и Oracle: x86 и x64.
Итак, ещё одно имя — x64.
Всё вместе
Подведу предварительный итог упомянутых в моей заметке обозначений вариантов архитектуры Intel.
- Для 32-битного варианта: IA-32, x86, i386, i486, i586, i686.
- Для 64-битного варианта: Intel 64, AMD64, amd64, EM64T, IA-32e, x86_64, x86-64, x64.
Итого четырнадцать. Если отбросить i386 — i686 как несущественные вариации, то десять.
Ложные имена
Как известно, за свою сорокалетнюю историю Intel выпускала (и выпускает сейчас) не только процессоры IA-32. Были и до сих пор присутствуют продукты других архитектур. Они тоже имеют свои имена, иногда несколько созвучные. При этом происходит путаница, от которой хотелось бы предостеречь.
Intel IA-64. Является полным синонимом термина «Intel Itanium». Используется для обозначения 64-битной архитектуры, несовместимой ни с IA-32, ни с 64-битным её вариантом ни по набору команд, ни по принципам работы. Да, существуют аппаратные и программные прослойки для запуска IA-32 приложений на Итаниуме, но это — тема для отдельного и интересного рассказа. Кстати, и для Itanium есть ещё одно обозначение — IPF, используемое изредка как суффикс.
К сожалению, линейки таких семейств процессоров Intel, как i432, i860, i960 или не дожили до наших дней, или же имеют крайне узкую нишу применения. А то глядишь — пришлось бы для каждого из них запоминать ещё по десятку имён.
- Скопировать ссылку
- ВКонтакте
- Telegram
Похожие публикации
- 15 ноября 2013 в 09:07
Правильно ли работает ваш дизассемблер?
Префиксы в системе команд IA-32
64 бита
Комментарии 51
Вот кстати давно хотел узнать: а почему нет единого документа, в котором было бы нарисовано когда вышла та или иная архитектура, какие новые фичи и наборы команд появились
Пожалуй, самая полная историческая справка о датах выхода и доступности разных фич в процессорах доступна в Википедии, как это ни удивительно. Про единый документ — чуть ниже.
как через CPUID эту архитектуру определить
Какой бит используется в CPUID для индикации наличия определённой инструкции или класса инструкций всегда можно понять из описания инструкции в мануале Intel SDM. Например, для ANDN из расширения BMI1:
Далее смотрим в том же мануале (может быть, в другом его томе), что ассоциируется с флагом BMI1 в CPUID.
В итоге о BMI2 я узнал совершенно случайно
Есть такой интересный документ: Intel® Architecture Instruction Set Extensions Programming Reference. В нём описываются инструкции, ещё не включенные в реальную продукцию, но планируемые быть доступными в не столь далёком будущем. Обновляется он достаточно часто (я один раз обнаружил, что имею у себя устаревшую локальную версию и из-за этого не в курсе, что вообще происходит). Его части со временем переезжают в Intel SDM, когда инструкции перестают быть «новыми». Очень полезный документ для писателей компиляторов, симуляторов и других программистов системного уровня.
Анонсы новых наборов случаются, кстати, и делаются на сайте Intel Developer Zone. Например, для Intel Haswell New Instructions, Intel RTM.
В каком документе перечислены все имеющиеся архитектуры Intel? 🙂
Немножко придерусь к словам. Если Вам интересны именно «архитектуры», т.е. видимые системному программисту абстракции и связанные с ними наборы команд, то их не очень много, и ещё меньше из них ныне здравствуют. Поддерживаются, наверное, только Itanium и IA-32, но я не выяснял точно. Остальные уже упомянуты в этом треде: 4004, 8008, iAPX 432 и т.д. Забыли, правда, про StrongARM/XScale.
Если же подразумевались «микроархитектуры», т.е. внутренние реализации архитектур, то обычно эту их имена не используют для целей рекламы. По крайней мере с именами микроархитектур не ассоциируют предлагаемые функциональные особенности/преимущества. Для этих нужд используют маркетинговое имя, вроде Intel® Core ™. Просто для того, чтобы оставить за собой пространство для манёвра, типа «вот описание архитектуры, а как она сделана внутри — это может поменяться без предварительного уведомления». Список микроархитектур для IA-32 ну очень длинный, я вынужден снова отослать интересующихся в Википедию.
Кстати, официальная база данных для сравнения выпущенных продуктов Intel называется ARK. С датами выхода, поддерживаемыми наборами команд, размерами и рекомендуемой ценой для партии. Есть даже Андроид приложение 🙂
Intel IA-64. Является полным синонимом термина «Intel Itanium».
…
Кстати, и для Itanium есть ещё одно обозначение — IPF.
Вполне официально расшифровывается как Intel Architecture. Создавалась как замена x86, которую переименовали в IA-32, и которая исчерпала свой потенциал по тогдашним представлениям самой Intel. Но внедрить принципиально новую и полностью несовместимую со старой технологию у них не получилось — подсуетилась AMD со своим 64-битным расширением к x86, под которую адаптировать софт и ОСы оказалось намного проще. Поэтому пришлось отказаться от IA-64 и бросить все силы в погоню за AMD. Вернули название x86, добавили EM64T (называть архитектуру IA-32 64-bit как-то глупо 🙂 а название IA-64 уже было занято, пришлось изголяться), вот так и получилась x86-64 и прочая чехарда с названиями.
Это маркетинговое название, которое не расшифровывается.
Ваша версия романтична, поэтична и очень красива, но не отражает действительность чуть более, чем полностью. Главная ошибка в ваших рассуждениях заключается в том, что вы предполагаете, что процессор от идеи до железа может быть реализован буквально за пол года в качесвте ответа на шаги конкурента. Это, к сожалению, не так. Примерно за два года до выхода железа публикуется его ISA — набор команд. На этот момент всё планирование, все эксперименты и багфикс в наборах инструкций уже завершён и осталось только отладить железячную часть. В этот момент можно напрячься и добавить кэшей, чуть увеличить тактовую частоту, но архитектура как таковая готова и команда работает уже давно над новыми чипами.
Итак, работа на Итаниумом началась ещё с лохматого 1989 года. Что, простите там было у AMD в тот момент? Чип делали долго и тщательно. Выверяли набор инструкций, проводили научные диспуты и старались сделать красивую архитектуру. В 2001 году сделали. Архитектура получилась красивая, стройная и лично мне она очень нравится. Но к сожалению, с некоторыми фундаментальными недостатками. Один из которых, заключается в том, что архитектура in-order и требует очень хорошей компиляторной поддержки для достижения хорошей или даже хотя бы приемлемой производительности. Ещё одним недостатком были проблемы с увеличением частоты из-за архитектурных особенностей, которые вовремя не смогли починить и частота долгое время была ахилесовой пятой этой архитектуры.
В это время х86 развивался и рос. Увеличивалось окно Out-Of-Order буфера, росло количество исполнительных устройств, взрослели векторные инструкции. Всё это сводило на нет преимущества широкого слова (Itanium2 способен за такт исполнять до 6 инструкций, правда если ограничения на инструкции одного типа).
В то время внедрение 64 битов в x86 не было насущной проблемой, они там были конечно нужны, но не то чтобы уж сильно. Непосредственно 64 бита несут скорее накладные расходы, чем преимущества — поинтеры-то длиннее, хранить их и гонять по памяти надо больше ресурсов. Вся прелесть 64 битов была в новых регистрах, которых стало больше и в новых инструкциях работы с ними — за счёт них и был прирост производительности. Но выпуск такого чита не был насущной необходимостью, у архитектуры были другие резервы увеличения производительности.
Естественно, в Интеле над 64 битами работали, но АМД обогнал на повороте и первым опубликовал свою спецификацию и первым выпустил чип. Это был умный и хитрый шаг. Но чип от Интел появился не сильно позже, что подтверждает, что он был и так практически готов. Но вот пришлось срочно переделывать имеющееся на ту спецификацию, которую выпустил АМД, ибо создавать ад для софтверной экосистемы в виде двух версий 64 битных чипов никто не хотел.
Заметьте, с Итаниумом это вообще никак не связано, он продолжал жить своей жизнью. Только вот с именованием получилась путаница и 64 битную версию x86 пришлось назвать Intel64, а IA-64 оставить за Итаниумом.
Я не очень понял ваше замечание про in-order. В IA-64 модель памяти слабее чем в x86/x64, есть value speculation, что дает больше возможностей по выполнению инструкций Out-Of-Order.
Архитектура x86 64
Существует несколько вариантов названий этой технологии, которые, порой, приводят к путанице и могут ввести пользователя в заблуждение.
- x86-64. Первоначальный вариант. Именно под этим названием фирмой AMD была опубликована первая предварительная спецификация.
- x64 Официальное название версий операционных систем Windows и Solaris, также используемое как название архитектуры фирмами Microsoft и Sun Microsystems.
- AA-64. Так архитектуру окрестил популярный неофициальный справочник sandpile.org (внеся информацию практически сразу после публикаций первой предварительной спецификации) по аналогии с IA-64, и по-прежнему так её называющий, как AMD Architecture 64.
- Hammer Architecture. Иногда встречалось название по первым разрабатываемым ядрам процессоров, получившим названия Clawhammer (гвоздодёр) и Sledgehammer (кувалда) иногда называемых просто Hammer (молоток).
- AMD64. После выпуска первых Hammer’ов в названии архитектуры появилось название фирмы-разработчика Advanced Micro Devices. Сейчас является официальным для реализации AMD.
- Yamhill Tehnology. Первое название 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 в пользу этого названия, которое теперь является единственным официальным для этой архитектуры.
На сегодняшний день наиболее распространёнными являются x64, x86-64 и AMD64. Порой упоминание AMD вводит пользователей в заблуждение, вплоть до того, что они отказываются скачивать дистрибутивы родных версий ОС, мотивируя это тем, что на их Intel-процессоре версия для AMD не пойдёт. На самом деле распространители ПО используют название amd64 лишь потому, что именно AMD была пионером в разработке этой технологии. Бывает, что пользователи путают архитектуру Intel 64 с IA-64, ошибочно скачивая ПО для этой архитектуры, и с удивлением обнаруживают, что программа не запускается. Во избежание подобных ошибок, всегда следует помнить, что Intel 64 и IA-64 это совершенно разные, несовместимые друг с другом, микропроцессорные архитектуры. Представители Intel 64 — это Pentium 4 (последние модели), ряд моделей Celeron D, семейство Core 2 и некоторые модели Intel Atom. Представители IA-64 — это семейства Itanium и Itanium 2.
Режимы работы
Процессоры архитектуры поддерживают два режима работы: Long mode («длинный» режим) и Legacy mode («наследственный», режим совместимости с x86).
Long Mode
«Длинный» режим — «родной» для процессоров AMD64. Этот режим позволяет воспользоваться всеми дополнительными возможностями, предоставляемыми архитектурой AMD64. Для использования этого режима необходима 64-битная операционная система, например, Windows XP Professional x64 Edition, Windows Vista x64, Windows 7 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-битных приложений, и другой — для 32-битных программ. (Этой же методикой пользовались ранние 32-битные системы — например, Windows 95 — для выполнения 16-битных программ). В «длинном» режиме упразднен ряд «рудиментов» архитектуры x86, таких, как режим виртуального 8086, сегментированная модель памяти (однако, осталась возможность использования сегментов FS и GS, что полезно для быстрого нахождения важных данных потока при переключении задач), аппаратная мультизадачность, а также ряд команд, как реализующих упраздненные возможности, так и работающие с BCD-числами, которые в новых программах практически не использовались. Среди особенностей «длинного» режима, следует отметить тот факт, что он активируется установкой флага CR0.PG, который используется для включения страничного MMU (при условии что такое переключение разрешено (EFER.LME=1), в противном случае просто произойдет включение MMU в «наследственном» режиме). Таким образом, невозможно исполнение 64-битного кода с запрещенным страничным преобразованием. Это создает определенные трудности в программировании, поскольку при переключении из «длинного» в «наследственный» режим и обратно (например, для вызова функций BIOS или DOS, монитором виртуальной машины, и т. д.) требуется двойной сброс MMU, для чего код переключения должен находиться в тождественно отображённой странице.
Legacy Mode
Данный «наследственный» режим позволяет процессору AMD64 выполнять инструкции, рассчитанные для процессоров x86, и предоставляет полную совместимость с 32/16-битным кодом и операционными системами. В этом режиме процессор ведёт себя точно так же, как x86-процессор, например Pentium 4, и дополнительные функции, предоставляемые архитектурой AMD64 (например, дополнительные регистры) недоступны. В этом режиме 64-битные программы и операционные системы работать не будут.
Особенности архитектуры
Разработанный компанией AMD набор инструкций x86-64 (позднее переименованный в AMD64) — расширение архитектуры Intel IA-32 (x86-32). Основной отличительной особенностью AMD64 является поддержка 16-ти 64-битных регистров общего назначения (против 8-и 32-битных в x86-32), 64-битных арифметических и логических операций над целыми числами и 64-битных виртуальных адресов. Для адресации новых регистров для команд введены так называемые «префиксы расширения регистра», для которых был выбран диапазон кодов 40h-4Fh, использующихся для команд INC и DEC в 32- и 16-битных режимах. Команды 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.
Смерть и возрождение сегментной модели организации памяти
Разрабатывая архитектуру x86-64, инженеры корпорации AMD решили навсегда покончить с главным «рудиментом» архитектуры x86 — сегментной моделью памяти, которая передавалась по наследству ещё со времён 8086/80286. Однако, как потом оказалось, они очень погорячились. Архитектура стала абсолютно невиртуализируемой. При разработке новой версии своего продукта для виртуализации программисты компании VMWare столкнулись с непреодолимыми трудностями при реализации 64-битной виртуальной машины. Поскольку, для отделения кода монитора от кода «гостя» программой использовался механизм сегментации, эта задача стала практически неразрешимой. Осознав свою ошибку, AMD вернула ограниченный вариант сегментной организации памяти начиная с ревизии D архитектуры AMD64, что позволило запускать 64-битные ОС в виртуальных машинах. Intel, однако, этому примеру не последовала, и поэтому ни на одном её процессоре, не поддерживающем средства аппаратной виртуализации, запустить 64-битную виртуальную машину нельзя. С целью проверки того, возможен ли на данном процессоре запуск 64-битных гостевых ОС или нет, VMWare предоставляет вместе со своими продуктами специальную утилиту. Также следует отметить, что первоначально попавшие «под нож» команды LAHF и SAHF, которые также активно используются ПО виртуализации, затем также были возвращены в систему команд. С распространением средств аппаратной виртуализации (Intel VT, AMD-V) потребность в сегментации вновь постепенно отпадет.
Урок 1. Что такое 64-битные системы
На момент написания курса, наиболее известными являются две 64-битные архитектуры микропроцессоров: IA64 и Intel 64.
- IA-64 64-битная микропроцессорная архитектура, разработанная совместно компаниями Intel и Hewlett Packard. Реализована в микропроцессорах Itanium и Itanium 2. Для более подробного знакомства с архитектурой IA-64 можно обратиться к следующим статьям в Wikipedia: «IA-64», «Itanium», «Itanium 2».
- Intel 64 (EM64T / AMD64 / x86-64 / x64) — данная архитектура представляет собой расширение архитектуры x86 с полной обратной совместимостью. Существует множество вариантов названия данной архитектуры, что приводит к путанице, хотя, по сути, все эти названия обозначают одно и тоже: x86-64, AA-64, Hammer Architecture, AMD64, Yamhill Technology, EM64T, IA-32e, Intel 64, x64. Более подробно узнать о том, как появилось так много названий, можно в статье из Wikipedia: «X86-64».
Важно понимать, что IA-64 и Intel 64 — это совершенно разные, несовместимые друг с другом, микропроцессорные архитектуры. В рамках курса мы будем рассматривать только архитектуру Intel 64 (x64 / AMD64) как более популярную среди разработчиков прикладного программного обеспечения для операционной системы Windows. Соответственно, когда будет упоминаться операционная система Windows, то будут иметься в виду ее 64-битные версии для архитектуры Intel 64. Примеры: Windows XP Professional x64 Edition, Windows Vista x64, Windows 7 x64. Для краткости программную модель Intel 64, доступную программисту в 64-битной системе Windows, называют Win64.
Архитектура Intel 64
Рассматриваемая архитектура Intel 64 — простое, но в то же время мощное обратно совместимое расширение устаревшей промышленной архитектуры x86. Она добавляет 64-битное адресное пространство и расширяет регистровые ресурсы для поддержки большей производительности перекомпилированных 64-битных программ. Архитектура обеспечивает поддержку устаревшего 16-битного и 32-битного кода приложений и операционных систем без их модификации или перекомпиляции.
Необходимость 64-битной архитектуры определяется приложениями, которым необходимо большое адресное пространство. В первую очередь это высокопроизводительные серверы, системы управления базами данных, САПР и, конечно, игры. Такие приложения получат существенные преимущества от 64-битного адресного пространства и увеличения количества регистров. Малое количество регистров, доступное в устаревшей x86 архитектуре, ограничивает производительность в вычислительных задачах. Увеличенное количество регистров обеспечивает достаточную производительность для многих приложений.
Подчеркнем основные достоинства архитектуры x86-64:
- 64-битное адресное пространство;
- расширенный набор регистров;
- привычный для разработчиков набор команд;
- возможность запуска старых 32-битных приложений в 64-битной операционной системе;
- возможность использования 32-битных операционных систем.
64-битные операционные системы
Практически все современные операционные системы сейчас имеют версии для архитектуры Intel 64. Например, Microsoft предоставляет Windows XP x64. Крупнейшие разработчики UNIX систем также поставляют 64-битные версии, как, например, Linux Debian 3.5 x86-64. Однако это не означает, что весь код такой системы является полностью 64-битным. Часть кода ОС и многие приложения вполне могут оставаться 32-битными, так как Intel 64 обеспечивает обратную совместимость. Так, 64-битная версия Windows использует специальный режим WoW64 (Windows-on-Windows 64), который транслирует вызовы 32-битных приложений к ресурсам 64-битной операционной системы.
Адресное пространство
Хотя 64-битный процессор теоретически может адресовать 16 экзабайт памяти (2^64), Win64 в настоящий момент поддерживает 16 терабайт (2^44). Этому есть несколько причин. Текущие процессоры могут обеспечивать доступ лишь к 1 терабайту (2^40) физической памяти. Архитектура (но не аппаратная часть) может расширить это пространство до 4 петабайт (2^52). Однако в этом случае необходимо огромное количество памяти для страничных таблиц, отображающих память.
Помимо перечисленных ограничений, объем памяти, который доступен в той или иной версии 64-битной операционной системе Windows, зависит также от коммерческих соображений компании Microsoft. Различные версии Windows имеют различные ограничения, представленные в таблице.
Таблица 1 — Поддерживаемый объем оперативной памяти в различных версиях Windows
Программная модель Win64
Также как и в Win32, размер страниц в Win64 составляет 4Кб. Первые 64Кб адресного пространства никогда не отображаются, то есть наименьший правильный адрес- это 0x10000. В отличие от Win32, системные DLL загружаются выше 4Гб.
Особенность компиляторов для Intel 64 в том, что они могут наиболее эффективно использовать регистры для передачи параметров в функции вместо использования стека. Это позволило разработчикам Win64 архитектуры избавиться от такого понятия, как соглашение о вызовах (calling convention). В Win32 можно использовать разные соглашения: __stdcall, __cdecl, __fastcall и так далее. В Win64 есть только одно соглашение о вызовах. Рассмотрим пример, как передаются в регистрах четыре аргумента типа integer:
- RCX: первый аргумент
- RDX: второй аргумент
- R8: третий аргумент
- R9: четвертый аргумент
Аргументы после первых четырех integer передаются на стеке. Для float аргументов используются XMM0-XMM3 регистры, а также стек.
Разница в соглашениях о вызове приводит к тому, что в одной программе нельзя использовать и 64-битный, и 32-битный код. Другими словами, если приложение скомпилировано для 64-битного режима, то все используемые библиотеки (DLL) также должны быть 64-битными.
Передача параметров через регистры является одним из новшеств, делающих 64-битные программы более производительными, чем 32-битные. Дополнительный выигрыш в производительности можно получить, используя 64-битные типы данных, о чем будет рассказано в соответствующем уроке.
Авторы курса: Андрей Карпов ( karpov@viva64.com ), Евгений Рыжков ( evg@viva64.com ).
Правообладателем курса «Уроки разработки 64-битных приложений на языке Си/Си++» является ООО «Системы программной верификации». Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com .
Найдите ошибки в своем C, C++, C# и Java коде
Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.