Адресация и многозадачность: Правила формирования линейного и физического адреса |
Программирование - Архитектура и система команд микропроцессоров 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, размещенных в любой части доступного адресного пространства, причем возможно совместное использование одного кода.
|