Адресация и многозадачность: Правила формирования линейного и физического адреса

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Линейный адрес — адрес, формируемый механизмом адресации процессора из логического адреса. Линейный адрес предназначен для обращения к линейному (непрерывному и несегментированному) адресному пространству объемом 232 байт (Intel386 …). При отключенном страничном механизме линейный адрес полностью совпадает с физическим адресом. Способ формирования линейного адреса из логического зависит от текущего режима работы процессора (реальный, защищенный, 32 или 16-битная адресация).

Физический адрес — адрес, передаваемый на внешнюю шину для обращения к ячейкам памяти. Типовые 32-разрядные процессоры (Pentium …) позволяют адресовать до 232 байт (4 Гб) физической памяти в обычном режиме и до 236 байт (64 Гб) в случае поддержки механизма расширения физического адреса (управляется CR4.PAE). Физический адрес образуется из линейного либо напрямую (полное совпадение), либо через механизм страничного преобразования.

 

Реальный режим

В реальном режиме работа всех современных процессоров происходит аналогично тому, как это делает процессор 8086. Некоторые отличия состоят лишь в поддержке большего количества команд и во много раз более высокой скорости работы. То есть программы, написанные для 8086, в большинстве случаев нормально работают на всех процессорах более поздних модификаций (включая Pentium IV и более поздние). Механизм формирования линейного адреса в реальном режиме работы (см. рис. 2.2.) предельно упрощен и позволяет адресовать адресное пространство объмом 220 байт (1 Мб).

 

Формирование линейного адреса в реальном режиме работы процессора

Рис. 2.2. Формирование линейного адреса в реальном режиме работы процессора

 

Полученный таким образом линейный адрес является фактически и физическим адресом. Существует, однако, одна особенность, которая проявляется в процессорах начиная с Intel286, где разрядность физического адреса превышает 20 бит. В случае задания селектора сегмента равным, например, FFFFh сумма базы сегмента и смещения может превысить FFFFFh (может достигать 10FFEFh). В процессоре 8086 в этом случае старший бит теряется и производится обращение к ячейке с адресом 0FFEFh, в более современных процессорах (Intel286 …) старший бит не отбрасывается и весь 21-битный линейный адрес преобразуется в физический и подается на адресную шину. Таким образом, появляется возможность в реальном режиме работы процессора обращаться к дополнительным 64 Кб адресного пространства. Поскольку такой режим работы может вызвать некорректное функционирование программ, написанных для процессора 8086, в процессорах начиная с Intel486 введена возможность маскирования 20-го разряда адресной шины внешним сигналом.

Еще одной особенностью процессоров начиная с Intel386 является возможность использования префикса изменения рамера адреса по умолчанию в реальном режиме работы. Поскольку в реальном режиме по умолчанию используется 16-битная адресация (размер смещения — 16 бит), то ввод данного префикса позволяет переключиться на использование 32-битного смещения. Однако величина этого смещения не должна превышать FFFFh (максимальный размер сегмента в реальном режиме). Для сохранения полной совместимости с процессором Intel286 попытка использования 32-битного смещения, превышающего 0000FFFFh приводит к генерации прерывания 12 (превышение стекового сегмента) или 13 (превышение прочих сегментов).

 

Защищенный режим

Работа механизма формирования линейного адреса в защищенном режиме работы процессора основана на двух специальных таблицах, размещаемых в памяти. Это глобальная таблица дескрипторов (GDT) и локальная таблица дескрипторов (LDT) (есть еще таблица дескрипторов прерываний, но она используется только при генерации прерываний и особых ситуаций ситуаций). Эти таблицы создаются и заполняются до переключения в защищенный режим, они содержат описания используемых программой сегментов памяти (базовый адрес, размер, тип, привилегии доступа и т.п.). Селектор сегмента, являющийся частью сформированного логического адреса в защищенном режиме содержит не базу физического адреса сегмента, а указатель на описание сегмента (дескриптор сегмента) в какой-либо таблице дескрипторов (LDT или GDT). Из выбранного таким образом дескриптора и смещения (вторая часть логического адреса) процессор автоматически вычисляет требуемый линейный адрес (рис. 2.3.).

 

Процесс формирования линейного адреса в защищенном режиме работы процессора

Рис. 2.3. Процесс формирования линейного адреса в защищенном режиме работы процессора

 

Положение таблиц дескрипторов в памяти задается следующим образом: для таблицы GDT — 32-разрядным значением ее линейного адреса в регистре GDTR, для таблицы LDT — специальным дескриптором в таблице GDT, ссылка на который (селектор) помещается в регистр LDTR.

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

В защищенном режиме в процессорах Intel386, Intel486 … может использоваться как 32-х, так и 16-битная модель адресации. Режим "по умолчанию" задается в дескрипторе соответствующего сегмента кода. При применении 16-битной адресации разрядность смещения уменьшается до 16 бит. При этом форматы селекторов и дескрипторов остаются такими же, как и при 32-битной адресации.

 

Режим V86

Режим V86 (виртуальный-8086) введен в процессорах начиная с Intel386 и является специальным подмножеством защищенного режима. Этот режим предназначен для выполнения программ, предназначенных для процессора 8086 или для реального режима работы более поздих процессоров архитектуры x86, в более гибком, поддерживающем многозадачность защищенном режиме.

Механизм формирования линейного адреса в режиме V86 работает аналогично тому, как это происходит в реальном режиме. Т.е. 16-битный селектор и 16-битное смещение формируют 20-битный логический адрес, который затем расширяется нулями для получения полного 32-битного линейного адреса. Возможно и применение префиксов изменения рамера адреса (смещение в этом случае не должно превышать FFFFFh).

В режиме V86 (также как и в реальном режиме работы процессоров Intel286 …) возможна адресация памяти старше 1Мб (10000h:1FFFEFh), при встрече такого адреса перехода на младшие адреса не происходит. Для эмуляции такого перехода может быть использован страничный механизм (адреса 100000h:110000h отображаются на адреса 00000h:10000h).

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