Пейджинг и виртуальная память

ОРГАНИЗАЦИЯ ПАМЯТИ

Память, которую процессор адресует на своей шине, называется физической памятью. Физическая память организована как последовательность 8-битных байтов. Каждому байту присваивается уникальный адрес, называемый физическим адресом. Физическое адресное пространство колеблется от нуля до максимума 236 - 1 (64 ГБ), если процессор не поддерживает архитектуру Intel 64. Архитектура Intel 64 представляет изменения в физическом и линейном адресном пространстве; они описаны в разделе 3.3.3, разделе 3.3.4 и разделе 3.3.7.

Практически любая операционная система или исполнительный директор, предназначенные для работы с процессором IA-32 или Intel 64, будут использовать средства управления памятью процессора для доступа к памяти. Эти средства предоставляют такие функции, как сегментация и пейджинг, которые позволяют эффективно и надежно управлять памятью. Управление памятью подробно описано в главе 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A. В следующих параграфах описываются основные методы адресации памяти при использовании управления памятью.

Модели памяти IA-32

При использовании средств управления памятью процессора программы напрямую не адресуют физическую память. Вместо этого они получают доступ к памяти с использованием одной из трех моделей памяти: плоский, сегментированный или реальный адресный режим:

• Модель с плоской памятью. Память отображается программой как единое непрерывное адресное пространство (рисунок 3-3). Это пространство называется линейным адресным пространством. Код, данные и стеки содержатся в этом адресном пространстве. Линейное адресное пространство является адресным адресом, с адресами, последовательно идущими от 0 до 232 - 1 (если не в режиме 64 бит). Адрес для любого байта в линейном адресном пространстве называется линейным адресом.

• Сегментированная модель памяти. Память появляется в программе как группа независимых адресных пространств, называемых сегментами. Код, данные и стеки обычно содержатся в отдельных сегментах. Для обращения к байту в сегменте программа выдает логический адрес. Это состоит из селектора сегментов и смещения (логические адреса часто называются дальними указателями). Селектор сегментов идентифицирует сегмент, к которому нужно получить доступ, и смещение идентифицирует байт в адресном пространстве сегмента. Программы, запущенные на процессоре IA-32, могут обрабатывать до 16383 сегментов разных размеров и типов, а каждый сегмент может достигать 232 байта.

Внутри все сегменты, определенные для системы, отображаются в линейное адресное пространство процессора. Чтобы получить доступ к памяти, процессор таким образом переводит каждый логический адрес в линейный адрес. Этот перевод является прозрачным для прикладной программы.

Основной причиной использования сегментированной памяти является повышение надежности программ и систем. Например, размещение стека программы в отдельном сегменте предотвращает рост стека в пространство кода или данных и инструкции или данные перезаписи соответственно.

• Модель памяти режима реального времени. Это модель памяти для процессора Intel 8086. Он поддерживается для обеспечения совместимости с существующими программами, написанными для работы на процессоре Intel 8086. Режим realaddress использует определенную реализацию сегментированной памяти, в которой линейное адресное пространство для программы и операционной системы / исполнительной системы состоит из массива сегментов размером до 64 Кбайт каждый. Максимальный размер линейного адресного пространства в режиме реального адреса составляет 220 байт.

См. Также: Глава 20, «Эмуляция 8086», Руководство разработчика программного обеспечения Intel® 64 и IA-32, том 3B.

Каноническая адресация

В 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).

Регистры общего назначения

Предусмотрены 32-разрядные регистры общего назначения EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP для хранения следующих элементов:

• Операнды для логических и арифметических операций

• Операнды для расчета адресов

• Указатели памяти

Хотя все эти регистры доступны для общего хранения операндов, результатов и указателей, следует соблюдать осторожность при обращении к регистру ESP. Регистр ESP содержит указатель стека, а общее правило не должно использоваться для других целей.

Многие инструкции назначают определенные регистры для хранения операндов. Например, строковые инструкции используют содержимое регистров ECX, ESI и EDI в качестве операндов. При использовании сегментированной модели памяти некоторые инструкции предполагают, что указатели в определенных регистрах относятся к определенным сегментам. Например, некоторые инструкции предполагают, что указатель в регистре EBX указывает на ячейку памяти в сегменте DS.

Особое использование регистров общего назначения по инструкциям описано в главе 5 «Сводка инструкций» в этом томе. См. Также: Глава 3, глава 4 и глава 5 Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, тома 2A, 2B и 2C. Ниже приводится сводка специальных применений:

• EAX - Аккумулятор для данных о операндах и результатах

• EBX - указатель на данные в сегменте DS

• ECX - счетчик для операций с строкой и контуром

• EDX - указатель ввода-вывода

• ESI - указатель на данные в сегменте, на который указывает регистр DS; указатель источника для строковых операций

• EDI - указатель на данные (или получатель) в сегменте, на который указывает ES-регистр; указатель назначения для строковых операций

• ESP - указатель стека (в сегменте SS)

• EBP - указатель на данные о стеке (в сегменте SS)

Как показано на рисунке 3-5, младшие 16 бит регистров общего назначения отображаются непосредственно в набор регистров, найденный в процессорах 8086 и Intel 286, и могут быть указаны с именами AX, BX, CX, DX, BP, SI , DI и SP. На каждый из двух нижних байтов регистров EAX, EBX, ECX и EDX могут ссылаться имена AH, BH, CH и DH (высокие байты) и AL, BL, CL и DL (низкие байты).

Регистры сегментов

Регистры сегментов (CS, DS, SS, ES, FS и GS) содержат 16-битные сегментные селектора. Селектор сегмента - это специальный указатель, который идентифицирует сегмент в памяти. Для доступа к определенному сегменту в памяти селектор сегмента для этого сегмента должен присутствовать в соответствующем регистре сегментов.

При написании кода приложения программисты обычно создают селектор сегментов с ассемблерными директивами и символами. Затем ассемблер и другие инструменты создают фактические значения селектора сегментов, связанные с этими директивами и символами. При написании системного кода программистам может потребоваться создать селектор сегментов напрямую. См. Главу 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A.

Использование сегментных регистров зависит от типа модели управления памятью, которую использует операционная система или исполнительная власть. При использовании плоской (несегментированной) модели памяти регистры сегментов загружаются селекторами сегментов, которые указывают на перекрывающиеся сегменты, каждый из которых начинается с адреса 0 линейного адресного пространства (см. Рис. 3-6). Эти перекрывающиеся сегменты затем содержат линейное адресное пространство для программы. Как правило, определяются два перекрывающихся сегмента: один для кода и другой для данных и стеков. Регистр сегмента CS указывает на сегмент кода, а все остальные регистры сегментов указывают на сегмент данных и стека.

При использовании сегментированной модели памяти каждый сегментный регистр обычно загружается с помощью другого селектора сегментов, так что каждый сегментный регистр указывает на другой сегмент в линейном адресном пространстве (см. Рис. 3-7). В любой момент программа может, таким образом, получить доступ к шести сегментам в линейном адресном пространстве. Для доступа к сегменту, на который не указывает один из сегментных регистров, программа должна сначала загрузить селектор сегмента для сегмента, к которому нужно получить доступ в регистре сегментов.

Каждый из регистров сегментов связан с одним из трех типов хранилища: кодом, данными или стеком. Например, регистр CS содержит селектор сегмента для сегмента кода, где хранятся выполняемые инструкции. Процессор извлекает команды из сегмента кода, используя логический адрес, который состоит из селектора сегментов в регистре CS и содержимого регистра EIP. Регистр EIP содержит смещение внутри сегмента кода следующей команды, которая должна быть выполнена. Регистр CS не может быть загружен явно прикладной программой. Вместо этого он неявно загружается инструкциями или операциями внутреннего процессора, которые изменяют управление программой (например, вызовы процедур, обработку прерываний или переключение задач).

Регистры DS, ES, FS и GS указывают на четыре сегмента данных. Доступность четырех сегментов данных обеспечивает эффективный и безопасный доступ к различным типам структур данных. Например, могут быть созданы четыре отдельных сегмента данных: один для структур данных текущего модуля, другой для данных, экспортированных из модуля более высокого уровня, третий для динамически созданной структуры данных и четвертый для данных, совместно используемых с другим программа. Для доступа к дополнительным сегментам данных прикладная программа должна загружать сегментные селектора для этих сегментов в регистры DS, ES, FS и GS, если это необходимо.

Регистр SS содержит селектор сегментов для сегмента стека, где стек процедуры хранится для выполняемой в настоящее время программы, задачи или обработчика. Все операции стека используют регистр SS для поиска сегмента стека. В отличие от регистра CS, регистр SS может быть загружен явно, что позволяет прикладным программам устанавливать несколько стеков и переключаться между ними.

См. Раздел 3.3 «Организация памяти» для обзора того, как регистры сегментов используются в режиме реального адреса.

Четыре сегмента регистров CS, DS, SS и ES такие же, как регистры сегментов, найденные в процессорах Intel 8086 и Intel 286, а регистры FS и GS были введены в архитектуру IA-32 с семейством процессоров Intel386 ™.

Флаги состояния

Флаги состояния (бит 0, 2, 4, 6, 7 и 11) регистра EFLAGS указывают результаты арифметических команд, таких как инструкции ADD, SUB, MUL и DIV. Функции флага статуса:

CF (бит 0) Флаг переноса - установить, если арифметическая операция генерирует перенос или заимствование из самого важного бита результата; очищается в противном случае. Этот флаг указывает условие переполнения для арифметики без знака. Он также используется в арифметике с несколькими точками.

PF (бит 2) Флаг четности - задайте, если младший байт результата содержит четное число из 1 бита; очищается в противном случае.

AF (бит 4) Флаг вспомогательной несущей - устанавливается, если арифметическая операция генерирует перенос или заимствование из бит 3 результата; очищается в противном случае. Этот флаг используется в двоично-кодированной десятичной (BCD) арифметике.

ZF (бит 6) Флаг нуля - установить, если результат равен нулю; очищается в противном случае.

SF (бит 7) Флаг знака - устанавливается равным самому значащему биту результата, который является битом знака целого числа со знаком. (0 указывает положительное значение, а 1 указывает отрицательное значение.)

OF (бит 11) Флаг переполнения - задайте, если целочисленный результат является слишком большим положительным числом или слишком маленьким отрицательным числом (исключая знаковый бит) для размещения в операнде назначения; очищается в противном случае. Этот флаг указывает условие переполнения для арифметики с подписью-целым числом (два дополнения).

Из этих флагов статуса только флаг CF может быть изменен напрямую, используя инструкции STC, CLC и CMC. Также битовые инструкции (BT, BTS, BTR и BTC) копируют указанный бит в флаг CF.

Флаги состояния позволяют одной арифметической операции создавать результаты для трех разных типов данных: целые числа без знака, целые числа со знаком и целые числа BCD. Если результат арифметической операции рассматривается как целое без знака, флаг CF указывает условие вне диапазона (перенос или заимствование); если обрабатывается как целое число со знаком (номер дополнения 2), флаг OF указывает перенос или заимствование; и если он рассматривается как цифра BCD, флаг AF указывает на перенос или заимствование. Флаг SF указывает знак целого числа со знаком. Флаг ZF указывает либо ноль с подписью или без знака.

При выполнении арифметики с высокой точностью для целых чисел флаг CF используется совместно с инструкцией addwithcarry (ADC) и вычитанием с помощью заимствования (SBB) для распространения переноса или заимствования из одного вычисления в другое.

Инструкции по условию Jcc (переход на код условия cc), SETcc (байт, установленный в коде условия cc), LOOPcc и CMOVcc (условное перемещение) используют один или несколько флажков состояния в качестве кодов условий и проверяют их для ветви, setbyte или условия конечного цикла.

Флаг DF

Флаг направления (DF, расположенный в бите 10 регистра EFLAGS) управляет строковыми инструкциями (MOVS, CMPS, SCAS, LODS и STOS). Установка флага DF приводит к автоматическому декременту строковых инструкций (для обработки строк с высоких адресов на низкие адреса). Очистка флага DF приводит к тому, что строковые инструкции автоматически увеличиваются (строки процесса от низких адресов до высоких адресов).

Инструкции STD и CLD устанавливают и очищают флаг DF, соответственно.

Системные флаги и поле IOPL

Системные флаги и поле IOPL в операционной системе регистрации регистров EFLAGS или исполнительных операциях. Они не должны модифицироваться прикладными программами. Функции системных флагов следующие:

TF (бит 8) Флаг ловушки - установить для включения одношагового режима для отладки; чтобы отключить одношаговый режим.

IF (бит 9) Флаг включения прерывания - управляет ответом процессора на маскируемые запросы прерываний. Установите для ответа на маскируемые прерывания; очищается для блокировки маскируемых прерываний.

IOPL (бит 12 и 13) Поле уровня привилегий ввода-вывода - указывает уровень привилегий ввода-вывода для текущей программы или задачи. Текущий уровень привилегий (CPL) текущей выполняемой программы или задачи должен быть меньше или равен уровню привилегий ввода-вывода для доступа к адресному пространству ввода-вывода. Инструкции POPF и IRET могут изменять это поле только при работе с CPL 0.

NT (бит 14) Вложенный флаг задачи - управляет цепочкой прерываний и вызываемых задач. Установить, когда текущая задача связана с ранее выполненной задачей; очищается, когда текущая задача не связана с другой задачей.

RF (бит 16) Возобновить флаг - управляет ответом процессора на исключения отладки.VM (бит 17) Флаг режима Virtual-8086 - включить режим виртуального 8086; чтобы вернуться в защищенный режим без семантики режима виртуального 8086.

AC (бит 18). Флаг проверки выравнивания (или контроля доступа). Если бит AM установлен в регистре CR0, проверка выравнивания доступа к данным в режиме пользователя разрешена тогда и только тогда, когда этот флаг равен 1. Если бит SMAP установлен в регистре CR4 допускаются явные режимы доступа к данным на страницах пользовательского режима, если и только если этот бит равен 1. См. раздел 4.6 «Права доступа» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, Том 3А.

VIF (бит 19). Виртуальный флаг прерывания - виртуальное изображение флага IF. Используется вместе с флагом VIP. (Чтобы использовать этот флаг и флаг VIP, расширения виртуального режима активируются установкой флага VME в управляющий регистр CR4.)

VIP (бит 20) Флаг ожидающего ожидания виртуального прерывания - установить, чтобы указать, что прерывание ожидает; очистить, когда прерывание не ожидается. (Программное обеспечение устанавливает и очищает этот флаг, процессор читает его только.) Используетсявместе с флагом VIF.

ID (бит 21). Идентификационный флаг. Способность программы устанавливать или очищать этот флаг означает поддержку инструкции CPUID.

Операнды регистров

Исходными и целевыми операндами могут быть любые из следующих регистров, в зависимости от выполняемой команды:

• 32-разрядные регистры общего назначения (EAX, EBX, ECX, EDX, ESI, EDI, ESP или EBP)

• 16-разрядные регистры общего назначения (AX, BX, CX, DX, SI, DI, SP или BP)

• 8-битные регистры общего назначения (AH, BH, CH, DH, AL, BL, CL или DL)

• регистры сегментов (CS, DS, SS, ES, FS и GS)

• Регистр EFLAGS

• регистры FQU x87 (ST0 - ST7, слово состояния, управляющее слово, слово тега, указатель операнда данных и указатель команд)

• Регистры MMX (от MM0 до MM7)

• Регистры XMM (от XMM0 до XMM7) и регистр MXCSR

• регистры управления (CR0, CR2, CR3 и CR4) и регистры указателей системной таблицы (GDTR,LDTR, IDTR и регистр задач)

• регистры отладки (DR0, DR1, DR2, DR3, DR6 и DR7)

• Регистры MSR

В некоторых инструкциях (например, в инструкциях DIV и MUL) используются операнды quadword, содержащиеся в паре 32-разрядных регистров. Регистровые пары представлены двоеточием, разделяющим их. Например, в паре регистров EDX: EAX, EDX содержит биты высокого порядка, а EAX содержит младшие биты четверного операнда.

Для загрузки и хранения содержимого регистра EFLAGS предусмотрено несколько инструкций (например, инструкции PUSHFD и POPFD) или для установки или очистки отдельных флагов в этом регистре. Другие инструкции (например, инструкции Jcc) используют состояние флагов состояния в регистре EFLAGS в качестве кодов условий для ветвления или других операций принятия решений.

Процессор содержит набор системных регистров, которые используются для управления памятью, обработки прерываний и исключений, управления задачами, управления процессорами и отладочных действий. Некоторые из этих системных регистров доступны с помощью прикладной программы, операционной системы или исполнительной власти с помощью набора системных инструкций. При обращении к системному регистру с системной инструкцией регистр обычно является подразумеваемым операндом команды.

Определение смещения

Смещение части адреса памяти может быть задано непосредственно как статическое значение (называемое смещением) или путем вычисления адреса, состоящего из одного или нескольких из следующих компонентов:

• Смещение - 8-, 16- или 32-битное значение.

• Base - значение в регистре общего назначения.

• Индекс - значение в регистре общего назначения.

• Масштабный коэффициент - значение 2, 4 или 8, умноженное на значение индекса.

Смещение, возникающее в результате добавления этих компонентов, называется эффективным адресом. Каждый из этих компонентов может иметь либо положительное, либо отрицательное (2s дополнение) значение, за исключением коэффициента масштабирования. На рисунке 3-11 показаны все возможные способы объединения этих компонентов для создания эффективного адреса в выбранном сегменте.

Рисунок 3-11. Вычисление смещения (или эффективного адреса)

Использование регистров общего назначения в качестве базовых или индексных компонентов ограничено следующим образом:

• Регистр ESP не может использоваться как индексный регистр.

• Когда в качестве базы используется регистр ESP или EBP, сегмент SS является сегментом по умолчанию. Во всех остальных случаях сегмент DS является сегментом по умолчанию.

Компоненты базы, индекса и смещения могут использоваться в любой комбинации, и любой из этих компонентов может быть NULL. Масштабный коэффициент может использоваться только при использовании индекса. Каждая возможная комбинация полезна для структур данных, обычно используемых программистами на языках высокого уровня и ассемблере.

Следующие режимы адресации предполагают использование общих комбинаций адресных компонентов.

• Смещение⎯Однотолькосмещениепредставляетсобойпрямое (несоизмеримое) смещениекоперанду. Посколькуперемещение кодируется в инструкции, эта форма адреса иногда называется абсолютным или статическим адресом. Он обычно используется для доступа к статически распределенному скалярному операнду.

• База⎯Толькобазапредставляетсобойкосвенноесмещениеоперанда. Поскольку значение в базовом регистре может измениться, оно может использоваться для динамического хранения переменных и структур данных.

• База + смещение ⎯Базовыйрегистрисмещениемогутиспользоватьсявместедлядвухразличныхцелей:

- Как индекс в массив, когда размер элемента не равен 2, 4 или 8 байтам. Компонент смещения кодирует статическое смещение в начале массива. Базовый регистр содержит результаты вычисления для определения смещения для определенного элемента в массиве.

- Для доступа к полю записи: базовый регистр содержит адрес начала записи, а смещение - статическое смещение в поле.

Важным частным случаем этой комбинации является доступ к параметрам в записи активации процедуры. Запись активации процедуры представляет собой фрейм стека, созданный при вводе процедуры. Здесь регистр EBP является лучшим выбором для базового регистра, поскольку он автоматически выбирает сегмент стека. Это компактная кодировка для этой общей функции.

• (Индекс * Масштаб) + Смещение⎯Этотрежим адресов предлагает эффективный способ индексирования в статический массив, когда размер элемента равен 2, 4 или 8 байтам. Перемещение определяет начало массива, индексный регистр содержит индекс требуемого элемента массива, и процессор автоматически преобразует индекс в индекс, применяя масштабный коэффициент.

• Base + Index + Displacement⎯Использованиедвухрегистроввместеподдерживаетлибодвумерныймассив (смещениесодержитадресначаламассива), либоодинизнесколькихэкземпляровмассивазаписей (смещение является смещением к полю в пределах записи).

• Base + (Index * Scale) + Displacement⎯Использованиевсехкомпонентовадресациивместепозволяетэффективноиндексироватьдвумерныймассив, когдаэлементымассиваимеютразмер 2, 4 или 8 байтов.

ОРГАНИЗАЦИЯ ПАМЯТИ

Память, которую процессор адресует на своей шине, называется физической памятью. Физическая память организована как последовательность 8-битных байтов. Каждому байту присваивается уникальный адрес, называемый физическим адресом. Физическое адресное пространство колеблется от нуля до максимума 236 - 1 (64 ГБ), если процессор не поддерживает архитектуру Intel 64. Архитектура Intel 64 представляет изменения в физическом и линейном адресном пространстве; они описаны в разделе 3.3.3, разделе 3.3.4 и разделе 3.3.7.

Практически любая операционная система или исполнительный директор, предназначенные для работы с процессором IA-32 или Intel 64, будут использовать средства управления памятью процессора для доступа к памяти. Эти средства предоставляют такие функции, как сегментация и пейджинг, которые позволяют эффективно и надежно управлять памятью. Управление памятью подробно описано в главе 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A. В следующих параграфах описываются основные методы адресации памяти при использовании управления памятью.

Модели памяти IA-32

При использовании средств управления памятью процессора программы напрямую не адресуют физическую память. Вместо этого они получают доступ к памяти с использованием одной из трех моделей памяти: плоский, сегментированный или реальный адресный режим:

• Модель с плоской памятью. Память отображается программой как единое непрерывное адресное пространство (рисунок 3-3). Это пространство называется линейным адресным пространством. Код, данные и стеки содержатся в этом адресном пространстве. Линейное адресное пространство является адресным адресом, с адресами, последовательно идущими от 0 до 232 - 1 (если не в режиме 64 бит). Адрес для любого байта в линейном адресном пространстве называется линейным адресом.

• Сегментированная модель памяти. Память появляется в программе как группа независимых адресных пространств, называемых сегментами. Код, данные и стеки обычно содержатся в отдельных сегментах. Для обращения к байту в сегменте программа выдает логический адрес. Это состоит из селектора сегментов и смещения (логические адреса часто называются дальними указателями). Селектор сегментов идентифицирует сегмент, к которому нужно получить доступ, и смещение идентифицирует байт в адресном пространстве сегмента. Программы, запущенные на процессоре IA-32, могут обрабатывать до 16383 сегментов разных размеров и типов, а каждый сегмент может достигать 232 байта.

Внутри все сегменты, определенные для системы, отображаются в линейное адресное пространство процессора. Чтобы получить доступ к памяти, процессор таким образом переводит каждый логический адрес в линейный адрес. Этот перевод является прозрачным для прикладной программы.

Основной причиной использования сегментированной памяти является повышение надежности программ и систем. Например, размещение стека программы в отдельном сегменте предотвращает рост стека в пространство кода или данных и инструкции или данные перезаписи соответственно.

• Модель памяти режима реального времени. Это модель памяти для процессора Intel 8086. Он поддерживается для обеспечения совместимости с существующими программами, написанными для работы на процессоре Intel 8086. Режим realaddress использует определенную реализацию сегментированной памяти, в которой линейное адресное пространство для программы и операционной системы / исполнительной системы состоит из массива сегментов размером до 64 Кбайт каждый. Максимальный размер линейного адресного пространства в режиме реального адреса составляет 220 байт.

См. Также: Глава 20, «Эмуляция 8086», Руководство разработчика программного обеспечения Intel® 64 и IA-32, том 3B.

Пейджинг и виртуальная память

С моделью с плоской или сегментированной памятью линейное адресное пространство отображается в физическое адресное пространство процессора либо напрямую, либо через пейджинг. При использовании прямого сопоставления (пейджинг отключен) каждый линейный адрес имеет взаимно однозначное соответствие физическому адресу. Линейные адреса отправляются на адресные строки процессора без перевода.

При использовании пейджингового механизма архитектуры IA-32 (с поддержкой пейджинга) линейное адресное пространство делится на страницы, которые сопоставляются с виртуальной памятью. Затем страницы виртуальной памяти отображаются в физической памяти. Когда операционная система или исполнитель использует пейджинг, механизм поискового вызова прозрачен для прикладной программы. Все, что видит приложение, - это линейное адресное пространство.

Кроме того, механизм поискового вызова архитектуры IA-32 включает в себя расширения, которые поддерживают:

• Расширения физических адресов (PAE) для адресации физического адресного пространства более 4 ГБ.

• Расширения размера страницы (PSE) для отображения линейного адреса на физический адрес на 4-мегабайтных страницах.

См. Также: Глава 3 «Управление памятью с защищенным режимом» в программном обеспечении Intel® 64 и IA-32

Руководство разработчика, том 3A.

Наши рекомендации