Если с внедрением 32-битности персональные платформы явно задержались, то появление 64-битных расширений для архитектуры x86 пришлось и к месту, и ко времени. Вопросом кому и зачем они нужны, компьютерная индустрия задавалась еще 15 лет назад. Сегодня, когда «все уже случилось», настало время вернуться к основам и уделить внимание некоторым неочевидным низкоуровневым подробностям.
64-битные данные
Обработка 64-битных данных базируется на расширении регистров общего назначения. Регистры, ранее существовавшие в 32-битной архитектуре, дополнились битовым полем такого же размера. Они стали младшими 32-битными половинами новых 64-битных регистров.

Формально, это не привело к увеличению максимальной ширины операндов, ведь обработка 64-битных целочисленных данных уже была реализована в Pentium MMX. Процессор Pentium III поддерживал еще и 128-битное расширение SSE.
Числа с плавающей точкой в 64-битном двойном формате (а равно и в 80-битном внутреннем вещественном формате) поддерживались ровесником IBM PC – математическим сопроцессором Intel 8087.
64-битный адрес
Именно ограничения 32-битного адресного пространства, объем которого составляет 232 = 4 Гигабайта стали основным мотивирующим фактором для перехода на 64-битную архитектуру. Заметим, что в некоторых системах программирования, лимит составлял 2 GB, так как старший бит указателя интерпретировался как знак числа. Возможность использовать технологию PAE для расширения физического адреса несколько украсила жизнь 32-битных систем. Очевидный недостаток состоял в том, что вместо плоского 64-битного адресного пространства применялся картируемый доступ к части ОЗУ, «не поместившейся» в 4GB-диапазон.
Акцент на адресацию памяти нашел отражение в названии 64-битной x86 архитектуры для CPU Intel — EM64T или Extended Memory 64 Technology. Напомним, процессорный гигант в то время строил планы по внедрению архитектуры IA-64 и процессоров Itanium, а название EM64T, возможно, было призвано подчеркнуть, что в отличие от IA-64, роль этой технологии сводится исключительно к увеличению объема адресуемой памяти. Как известно, жизнь распорядилась по-другому, «революционный» Itanium уступил «временному» решению авторства AMD, которое, как это часто бывает, надолго стало постоянным.
64-битные инструкции
Фактором, обеспечившим сравнительную легкость перехода на архитектуру AMD64 (синоним Intel EM64T), стало сохранение основ программной модели и принципов кодирования инструкций, применявшихся в 16-ти и 32-битных процессорах x86. При этом для представления новых команд и форматов данных используется специальный префикс REX (Register Extension), наличие которого перед машинной командой изменяет ее интерпретацию.

Перед разработчиками стояла своеобразная оптимизационная задача. Объем машинного кода можно минимизировать, если наиболее часто встречающимся форматам команд и разрядностям операндов будет соответствовать беcпрефиксное кодирование. В результате, при выполнении 64-битных сегментов кода, режимом по умолчанию был принят режим 32-битных данных и 64-битных адресов. Для задания 64-битных данных, например, использования 64-битного регистра RAX вместо 32-битного EAX, потребуется префикс REX.
Дополнительным преимуществом 64-битной архитектуры является увеличение количества регистров общего назначения и SSE/AVX-регистров до 16. Конечно, этот факт не имеет фундаментальной связи с разрядностью процессора, а обусловлен особенностями кодирования инструкций.

Часть битов префикса REX используются для расширения полей, адресующих регистры. Таким образом, номер регистра становится 4-разрядным, а значит можно адресовать 16 элементов. Так в множество регистров общего назначения были добавлены 8 регистров R8-R15, а блок SSE получил расширение в виде регистров XMM8-XMM15.
64-битная периферия и Memory Mapped IO
Модернизация контроллеров периферийных устройств, работающих в составе 64-битных платформ, происходила с некоторым запаздыванием, относительно CPU, тем не менее, функциональность, рассмотренную ниже на сегодня можно считать свершившимся фактом для ключевых индустриальных спецификаций, таких как интерфейс NVMe и контроллер USB xHCI.

Для обеспечения программного доступа центрального процессора к ресурсам периферийных устройств, расположенных в адресном пространстве памяти (memory mapped IO), согласно принципам PCI PnP, базовый адрес задается в регистре BAR (Base Address Register). 32-битный BAR позволяет расположить ресурсы устройства только в пределах нижних 4 Гигабайт. 64-битный BAR снимает это ограничение, при условии, что транзитные компоненты, такие как мосты и разветвители шины PCI Express, также поддерживают 64-битную адресацию. Для систем с большим суммарным объемом memory-mapped IO (например, майнинговых ферм), это может повлиять на максимальное количество подключаемых GPU.
64-битная периферия и режим Bus Master
Для контроллеров, самостоятельно взаимодействующих с оперативной памятью платформы, поддержка 64-битной адресации позволяет располагать буфер данных в произвольном диапазоне DRAM.

В противном случае, если Bus Master устройство (например, контроллер mass storage или локальной сети), поддерживает только 32-битную адресацию, ОС должна выделить транзитный буфер для такого устройства ниже границы 4GB, а прямая доставка данных в адресное пространство приложения, в общем случае будет невозможна.
Фактор ПО
Необходимым условием утилизации рассмотренных преимуществ и как следствие роста функциональности и производительности, является оптимизация ПО, причем как прикладного, так и системного. Именно этот сегмент может претендовать на статус самого инерционного…