Расширенная физическая адресация в защищенном режиме
Начиная с процессоров семейства P6, архитектура IA-32 поддерживает адресацию физической памяти до 64 Гбайт (236 байт). Программа или задача не могли напрямую адресовать адреса в этом адресном пространстве. Вместо этого он обращается к отдельным линейным адресным пространствам до 4 ГБ, которые сопоставляются с физическим адресным пространством на 64 Гбайт через механизм управления виртуальной памятью. Используя этот механизм, операционная система может включить программу для переключения линейных адресных пространств 4-гигабайта в физическое адресное пространство 64 ГБ.
Использование расширенной физической адресации требует, чтобы процессор работал в защищенном режиме, а операционная система обеспечивала систему управления виртуальной памятью. См. «36-битная физическая адресация с использованием механизма подкачки PAE» в главе 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A.
Расчет адресов в 64-битном режиме
В большинстве случаев 64-разрядный режим использует плоское адресное пространство для кода, данных и стеков. В 64-битном режиме (при отсутствии переопределения размера адреса) размер эффективных вычислений адресов составляет 64 бита. Расчет эффективного адреса использует 64-разрядные базовые и индексные регистры и смещения с расширением знака до 64 бит.
В плоском адресном пространстве 64-битного режима линейные адреса равны эффективным адресам, так как базовый адрес равен нулю. Если сегменты FS или GS используются с ненулевой базой, это правило не выполняется. В 64-битном режиме добавляются эффективные компоненты адреса, а эффективный адрес усекается (см., Например, инструкцию LEA) перед добавлением полной базы 64-битного сегмента. База никогда не усекается, независимо от режима адресации в 64-битном режиме.
Указатель команд расширяется до 64 бит для поддержки смещения 64-битного кода. 64-разрядный указатель инструкции называется RIP. В таблице 3-1 показана взаимосвязь между RIP, EIP и IP.
Таблица 3-1. Размеры указателя команд
Биты 63:32 | Биты 31:16 | Биты 15:0 | |
16-битный указатель команд | Не изменено | IP | |
32-битный указатель команд | Нулевое расширение | EIP | |
64-битный указатель команд | RIP |
Как правило, перемещения и немедленные действия в 64-битном режиме не распространяются на 64 бита. Они по-прежнему ограничены 32 битами и расширенными знаками при вычислении эффективных адресов. Однако в 64-битном режиме поддерживается поддержка 64-битного смещения и немедленных форм инструкции MOV.
Все 16-битные и 32-разрядные вычисления адресов в режиме IA-32e с нулевым расширением для формирования 64-разрядных адресов. Вычисления адресов сначала усекаются до эффективного размера адреса текущего режима (режим 64-бит или режим совместимости), как переопределенный любым префиксом размера адреса. Затем результат будет равен нулю - до полной ширины 64-битного адреса. Из-за этого 16-разрядные и 32-разрядные приложения, работающие в режиме совместимости, могут получить доступ только к низким 4 ГБ эффективных адресов с 64-битным режимом. Аналогично, 32-разрядный адрес, сгенерированный в 64-битном режиме, может получить доступ только к низким 4 ГБ эффективных адресов 64-битного режима.
Каноническая адресация
В 64-битном режиме адрес считается в канонической форме, если адресные биты 63 до самого значительного реализованного бита микроархитектурой установлены либо на все, либо на все нули.
Архитектура Intel 64 определяет 64-битный линейный адрес. Реализации могут поддерживать меньше. Первая реализация процессоров IA-32 с архитектурой Intel 64 поддерживает 48-битный линейный адрес. Это означает, что канонический адрес должен иметь биты с 63 по 48, установленные на нули или единицы (в зависимости от того, является ли бит 47 нулем или одним).
Хотя реализации не могут использовать все 64 бита линейного адреса, они должны проверять биты 63 через самый значительный реализованный бит, чтобы узнать, находится ли адрес в канонической форме. Если ссылка на линейную память не находится в канонической форме, реализация должна генерировать исключение. В большинстве случаев генерируется исключение общей защиты (#GP). Однако в случае явных или подразумеваемых ссылок на стек генерируется ошибка стека (#SS).
Инструкции, которые подразумевают ссылки на стек, по умолчанию используют регистр сегментов SS. К ним относятся PUSH / POPrelated инструкции и инструкции с использованием RSP / RBP в качестве базовых регистров. В этих случаях каноническая ошибка #SS.
Если инструкция использует базовые регистры RSP / RBP и использует префикс переопределения сегмента для указания сегмента без SS, каноническая ошибка генерирует #GP (вместо #SS). В 64-битном режиме в этой ситуации применимы только FS и GS-переопределения. Другие префикс переопределения сегмента (CS, DS, ES и SS) игнорируются. Обратите внимание, что это также означает, что переопределение SS-сегмента, примененное к ссылке на регистр «не стека», игнорируется. Такая последовательность все еще производит #GP для канонической ошибки (а не #SS).