﻿# Урок 1\. Что такое 64\-битные системы

На момент написания курса, наиболее известными являются две [64\-битные](https://pvs-studio.ru/ru/blog/terms/0001/) архитектуры микропроцессоров: IA64 и Intel 64\.

1. **IA\-64** 64\-битная микропроцессорная архитектура, разработанная совместно компаниями Intel и Hewlett Packard\. Реализована в микропроцессорах Itanium и Itanium 2\. Для более подробного знакомства с архитектурой IA\-64 можно обратиться к следующим статьям в Wikipedia: "[IA\-64](https://ru.wikipedia.org/wiki/IA-64)", "[Itanium](https://ru.wikipedia.org/wiki/Itanium)", "[Itanium 2](https://ru.wikipedia.org/wiki/Itanium#2002.E2.80.942009._Itanium_2)"\.
1. **Intel 64** \(EM64T / AMD64 **/** x86\-64 / x64\) \- данная архитектура представляет собой расширение архитектуры [x86](https://pvs-studio.ru/ru/blog/terms/0060/) с полной обратной совместимостью\. Существует множество вариантов названия данной архитектуры, что приводит к путанице, хотя, по сути, все эти названия обозначают одно и тоже: x86\-64, AA\-64, Hammer Architecture, AMD64, Yamhill Technology, EM64T, IA\-32e, Intel 64, x64\. Более подробно узнать о том, как появилось так много названий, можно в статье из Wikipedia: "[X86\-64](https://ru.wikipedia.org/wiki/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](https://pvs-studio.ru/ru/blog/terms/0055/)\.

## Архитектура Intel 64

Представленная здесь информация основана на первом томе документации "[AMD64 Architecture Programmer's Manual\. Volume 1\. Application Programming](http://developer.amd.com/wordpress/media/2012/10/24592_APM_v11.pdf)"\.

Рассматриваемая архитектура [Intel 64](https://pvs-studio.ru/ru/blog/terms/0022/) \- простое, но в то же время мощное обратно совместимое расширение устаревшей промышленной архитектуры 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](https://pvs-studio.ru/ru/blog/terms/0056/) \(Windows\-on\-Windows 64\), который транслирует вызовы 32\-битных приложений к ресурсам 64\-битной операционной системы\.

## Адресное пространство

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

Помимо перечисленных ограничений, объем памяти, который доступен в той или иной версии 64\-битной операционной системе Windows, зависит также от коммерческих соображений компании Microsoft\. Различные версии Windows имеют различные ограничения, представленные в таблице\.

![01_What_64-bit_systems_are_ru/image1.png](https://import.viva64.com/docx/blog/01_What_64-bit_systems_are_ru/image1.png)

_Таблица 1 \- Поддерживаемый объем оперативной памяти в различных версиях Windows_

## Программная модель Win64

Также как и в [Win32](https://pvs-studio.ru/ru/blog/terms/0054/), размер страниц в Win64 составляет 4Кб\. Первые 64Кб адресного пространства никогда не отображаются, то есть наименьший правильный адрес\- это 0x10000\. В отличие от Win32, системные DLL загружаются выше 4Гб\.

Особенность компиляторов для Intel 64 в том, что они могут наиболее эффективно использовать регистры для передачи параметров в функции вместо использования стека\. Это позволило разработчикам Win64 архитектуры избавиться от такого понятия, как [соглашение о вызовах](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5) \(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](mailto:karpov@viva64.com)\), Евгений Рыжков \([evg@viva64\.com](mailto:evg@viva64.com)\)\._

_Правообладателем курса "Уроки разработки 64\-битных приложений на языке Си/Си\+\+" является ООО "Системы программной верификации"\. Компания занимается разработкой программного обеспечения в области анализа исходного кода программ\. [Сайт компании](https://pvs-studio.ru/ru/pvs-studio/)\._