Ранее «секретный» проект Intel по 64-разрядному расширению х86 оказался правдой
Помимо процессоров Xeon, поддержка 64-разрядных расширений будет реализована и в 0,09-микронных Pentium 4 (Prescott), предназначенных для использования в серверах и рабочих станциях

Есть такое старинное развлечение для читателей печатных изданий — дается два почти идентичных рисунка и предлагается найти заданное количество отличий. Недавно Intel официально заявила о поддержке 64-разрядного расширения архитектуры IA-32, получившей название IA-32e, в своих будущих серверных микропроцессорах Xeon с кодовым названием Nocona. Почти одновременно корпорация разместила на своем Web-сайте двухтомное описание IA-32e, и специалисты по компьютерным архитектурам спешно занялись поиском отличий от предложенного ранее компанией AMD 64-разрядного расширения AMD64, прежде имевшего также название x86-64. Так вот, дело в том, что в первом приближении эти 64-разрядные расширения совпадают.

32 разряда: начало конца

AMD, которая первой предложила 64-разрядные расширения архитектуры IA-32, реализовала их в своих микропроцессорах — как для серверов (Opteron), так и для настольных ПК (Athlon 64). Intel также вела собственные разработки 64-разрядных расширений IA-32 и соответствующих процессоров (проект Yamhill, о котором мы писали более полугода назад, см. «План ?Б?: без комментариев», Computerworld Россия, № 32, 2003), однако официально корпорация этого не подтверждала.

В последнее время в различных источниках появилась масса сообщений о том, что процессор Prescott в действительности является 64-разрядным, но пользователям эти расширения доступны не будут. Сообщалось также, что первым 64-разрядным процессором Intel с архитектурой IA-32e будет Tejas, появления которого ждут в 2005 году. Похоже, что успехи Opteron и Athlon 64 вкупе с активной (и, увы, подчас безграмотной) пропагандой «крутизны» 64-разрядных вычислений подтолкнули Intel к тому, чтобы ускорить выпуск IA-32e «в железе».

В течение некоторого времени специалисты гадали, будут ли 64-разрядные расширения Intel и AMD совместимы друг с другом. Prescott, дебютировавший в феврале, якобы такой совместимости не имел. Intel могла позволить себе сделать собственные расширения, несовместимые с х86-64, что могло осложнить жизнь AMD. Однако той удалось привлечь на свою сторону раз???ра?бот?чиков Linux-дистрибутивов и, что, пожалуй, важнее, корпорацию Microsoft. В Редмонде уже завершается разработка 64-разрядной версии Windows. Вряд ли разработчики программного обеспечения были бы счастливы получить альтернативную 64-разрядную аппаратную платформу.

Судя по всему, из проекта Yamhill и родилась технология Clackamas Technology (Клакамас — округ в штате Орегон), которая используется в Xeon/Nocona. Подробности микроархитектуры пока неизвестны, но зато режим IA-32e описан вполне исчерпывающе.

IA-32e под микроскопом

Итак, 64-разрядные расширения IA-32e почти полностью совпадают с х86-64. Они включают увеличение длины регистров общего назначения (EAX, EBX и т. д.) до 64 разрядов одновременно с увеличением их числа на 8 (до 16), поддержку «плоской» 64-разрядной адресации, увеличение длины счетчика команд до 64, восемь дополнительных регистров для SIMD-команд (XMM8-15) и др.

Даже восемь дополнительных команд х86-64 (SYSCALL, SYSRET и др.) — те же, и отдельные разряды в управляющем регистре CR3 совпадают. Естественно, имеются и те же режимы работы (в смысле поддержки 32 и 64 разрядов, в том числе long mode — основной режим для 64-разрядной адресации), что и в х86-64 (подробнее об архитектуре AMD64 см. «64-разрядные микропроцессоры AMD», «Открытые системы», № 4, 2002).

Теперь — об обнаруженных отличиях. Начнем с тривиальных. У AMD имеются команды 3DNow! Их, естественно, нет в IA-32e, но зато в ней присутствуют команды SSE3 (появившиеся в Prsecott) и средства Hyper-Threading. Можно, кстати, предположить, что в будущем AMD также реализует команды SSE3.

В описаниях x86-64 «всегда» говорится о 64 разрядах, в то время как в IA-32e указатели адресов являются 64-разрядными, а целочисленные операции по умолчанию выполняются над 32-разрядными величинами.

Для работы с 64-разрядными целыми надо явно указывать специальный префикс REX (register extension — «расширение регистров»; этот префикс имеется и в х86-64). Это способствует уменьшению размера кодов в «умалчиваемом» варианте при использовании IA-32e.

В документации к IA-32e говорится о 64-разрядном физическом адресном пространстве, в то время как микроархитектурная реализация может иметь меньшую разрядность. В AMD говорят о 52-разрядном физическом адресном пространстве (с возможностью соответствующего уменьшения разрядности в конкретных реализациях).

По части сегментно-страничной организации памяти также почти все совпадает, но имеются минимальные отличия. В AMD64 выполнение команд LFS, LGS и LSS с операндом 64-разрядной длины загружает, кроме указанного регистра сегмента, 32-разрядный регистр общего назначения. В IA-32e при этом в соответствующий регистр загружается уже не 32-, а 64-разрядное значение.

IA-32e, в отличие от AMD64, не имеет бита NX в дескрипторах страниц. Бит NX (Not Execute) служит для дополнительной защиты страниц и указывает, что команды из этой страницы виртуальной памяти выполнять нельзя (этот бит применим при работе с TLB в случае использования режима PAE — Physical Address Extensions).

Интересно, что в Microsoft собирались использовать бит NX в Windows XP Service Pack 2. Операционная система OpenBSD на аппаратных платформах, поддерживающих бит NX, также использует специальные коды.

Приведем еще несколько найденных отличий. IA-32e поддерживает команды SYSENTER и SYSEXIT в long mode, в AMD64 этого нет. IA-32e не поддерживает SYSCALL и SYSRET в 32-разрядном режиме, а AMD64 — поддерживает. В AMD64 операции чтения и записи регистра CR8 требуют применения префикса REX, то есть будут работать только в 64-разрядном режиме (правда, CR8 можно прочитать и изменить через так называемый регистр приоритета задачи). В IA-32e этих ограничений нет: команда MOVcr с CR8 в качестве операнда будет работать и без применения префикса REX.

Я насчитал всего девять отличий, но не исключаю, что их может оказаться и больше после детальной проверки документации по обработке прерываний, моделезависимым регистрам и другим тонким вещам. Однако изложенное выше уже достаточно хорошо иллюстрирует, насколько IA-32e близка к х86-64. Вполне вероятно, что ОС для х86-64 будут загружаться и работать на IA-32e, хотя полностью исключить «подводные камни» нельзя.

Угроза «старшему брату»

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

Однако, что бы там ни говорилось, IA-64 и IA-32e будут конкурировать между собой. Да, IA-64 ориентирована на рынок «более тяжелых» приложений, чем IA-32e, в первую очередь из-за более высокой производительности Itanium 2. Однако отрыв в производительности у современных Itanium 2/Madison от лучших представителей х86 не так уж велик. (Правда, в Intel обещают, что будущие процессоры семейства Itanium по производительности будут обгонять представителей линии IA-32 сильнее.)

Не нужно забывать при этом и о соотношении цена/производительность. Сейчас оно, если отвлечься от магии 64 разрядов, лучше у х86. Как будет дальше, конечно, пока неясно.

В целом не приходится сомневаться, что 32-разрядным системам рано или поздно придется потесниться на рынке, и 64-разрядные микропроцессоры будут господствовать не только в серверах, но и в настольных ПК.