Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM.docx
Скачиваний:
3
Добавлен:
31.07.2019
Размер:
616.28 Кб
Скачать

I80386 первым из семейства процессоров Intel стал поддерживать возможность

параллельного функционирования своих устройств: устройства шинного интер-

фейса (bus interface unit), блока предварительной выборки (code prefetch unit), бло-

ка декодирования команд (instruction decode unit), исполнительного блока (execution

unit), блока сегментации (segment unit), блока страничной адресации (paging unit).

Стек — это специальным образом организованный участок памяти, используемый для временного хранения переменных, для передачи параметров вызываемым подпрограммам и для сохранения адреса возврата при вызове процедур и прерываний. Легче всего представить стек в виде стопки листов бумаги (это одно из значений слова «stack» в английском языке) — вы можете класть и забирать листы бумаги только с вершины стопки. Таким образом, если записать в стек числа 1, 2, 3, то при чтении они будут получаться в обратном порядке — 3, 2, 1. Стек располагается в сегменте памяти, описываемом регистром SS, а текущее смещение вершины стека записано в регистре ESP, причем при записи в стек значение этого смещения уменьшается, то есть стек растет вниз от максимально возможного адреса (рис. 4). Такое расположение стека «вверх ногами» может быть необходимо, например в бессегментной модели памяти, когда все сегменты, включая сегмент стека и сегмент кода, занимают одну и ту же область — всю память. Тогда программа исполняется в нижней области памяти, в области малых адресов, и EIP растет, а стек располагается в верхней области памяти, и ESP уменьшается.

При вызове подпрограммы параметры в большинстве случаев помещают в стек, а в EBP записывают текущее значение ESP. Тогда, если подпрограмма использует стек для хранения локальных переменных, ESP изменится, но EBP можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения будут записываться как EBP + номер параметра).

23Формирование адреса. Сегментная адресация в реальном и защищенном режимах. Размер сегмента. Адресное пространство.

Организация памяти

Физическая память, к которой процессор имеет доступ по шине адреса (см. рис. 1.2),

называется оперативной памятью (или оперативным запоминающим устрой-

ством — ОЗУ). На самом нижнем уровне память компьютера можно рассматри-

вать как массив битов. Один бит может хранить значение 0 или 1. Для физической

реализации битов и работы с ними идеально подходят логические схемы. Но про-

цессору неудобно работать с памятью на уровне битов, поэтому реально ОЗУ орга-

низовано как последовательность ячеек — байтов. Один байт состоит из восьми

битов. Каждому байту соответствует свой уникальный адрес (его номер), называ-

емый физическим. Диапазон значений физических адресов зависит от разряднос-

ти шины адреса процессора. Для i486 и Pentium он находится в пределах от

О до 232 - 1 (4 Гбайт). Для процессоров Pentium Pro/II/III/IV этот диапазон

шире — от 0 до 236 - 1 (64 Гбайт).

Механизм управления памятью полностью аппаратный. Это означает, что про-

грамма не может сама сформировать физический адрес памяти на адресной шине.

Ей приходится «играть» по правилам процессора. Что это за правила, мы узнаем

чуть позже. Пока же отметим, что в конечном итоге этот механизм позволяет обес-

печить:

компактность хранения адреса в машинной команде;

гибкость механизма адресации;

защиту адресных пространств задач в многозадачной системе;

поддержку виртуальной памяти.

Процессор аппаратно поддерживает две модели использования оперативной

памяти.

В сегментированной модели программе выделяются непрерывные области па-

мяти (сегменты), а сама программа может обращаться только к данным, кото-

рые находятся в этих сегментах.

* Страничную модель можно рассматривать как надстройку над сегментирован-

ной моделью. В случае использования этой модели оперативная память рас-

сматривается как совокупность блоков фиксированного размера (4 Кбайт и бо-

лее). Основное применение этой модели связано с организацией виртуальной

памяти, что позволяет операционной системе использовать для работы про-

грамм пространство памяти большее, чем объем физической памяти. Для про-

цессоров i486 и Pentium размер возможной виртуальной памяти может дости-

гать 4 Тбайт.

Сегментированная модель памяти

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

независимых адресных пространств как в пределах одной задачи, так и в системе

в целом для защиты задач от взаимного влияния. В основе механизма сегмента-

ции лежит понятие сегмента, который представляет собой независимый поддер-

живаемый на аппаратном уровне блок памяти.

Когда мы рассматривали сегментные регистры, то отмечали, что для процессо-

ров Intel, начиная с 18086, принят особый подход к управлению памятью. Каждая

программа в общем случае может состоять из любого количества сегментов, но

непосредственный доступ она имеет только к трем основным сегментам (кода, дан-

ных и стека), а также к дополнительным сегментам данных числом от одного до

трех. Программа никогда не знает, по каким физическим адресам будут размеще-

ны ее сегменты. Этим занимается операционная система. Операционная система

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

ческим адресам, после чего помещает значения этих адресов в определенные мес-

та. Куда именно, зависит от режима работы процессора. Так, в реальном режиме

эти адреса помещаются непосредственно в соответствующие сегментные регист-

ры, а в защищенном режиме они размещаются в элементы специальной системной

дескрипторной таблицы. Внутри сегмента программа обращается к адресам отно-

сительно начала сегмента линейно, то есть начиная с 0 и заканчивая адресом, рав-

ным размеру сегмента. Этот относительный адрес, или смещение, который процес-

сор использует для доступа к данным внутри сегмента, называется эффективным.

Отличия моделей сегментированной организации памяти в различных режи-

мах хорошо видны на схеме (рис. 2.7). Различают три основных модели сегменти-

рованной организации памяти:

Рассмотрим порядок формирования физического адреса в реальном и защи-

щенном режимах. Уточним терминологию. Под физическим адресом понимается

адрес памяти, выдаваемый на шину адреса процессора. Другое название этого ад-

реса — линейный адрес. Подобная двойственность в названии обусловлена нали-

чием страничной модели организации оперативной памяти. Эти названия явля-

ются синонимами только при отключении страничного преобразования адреса.

(в реальном режиме страничная адресация всегда отключена). Страничная модель,

как мы отметили ранее, является надстройкой над сегментированной моделью.

В страничной модели линейный и физический адреса имеют разные значения. Да-

лее мы будем обсуждать схему, на которой показан порядок формирования адреса

в реальном режиме работы процессора. Обратите внимание на наличие в этой схе-

ме устройства страничного преобразования адреса, предназначенного для того, что-

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

мяти и выдать на шину адреса истинное значение физического адреса памяти.

Формирование физического адреса в реальном режиме

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

в реальном режиме.

* Диапазон изменения физического адреса — от 0 до 1 Мбайт. Эта величина опре-

деляется тем, что шина адреса i8086 имела 20 линий.

« Максимальный размер сегмента— 64 Кбайт. Это объясняется 16-разрядной

архитектурой 18086. Нетрудно подсчитать, что максимальное значение, кото-

рое могут содержать 16-разрядные регистры, составляет 216 - 1, что примени-

тельно к памяти и определяет величину 64 Кбайт.

II Для обращения к конкретному физическому адресу оперативной памяти необ-

ходимо определить адрес начала сегмента (сегментную составляющую) и сме-

щение внутри сегмента.

Понятие адреса начала сегмента ввиду принципиальной важности требует до-

полнительного пояснения. Исходя из разрядности сегментных регистров, можно

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

ляет собой всего лишь 16-разрядное значение, помещенное в один из сегментных

регистров. Максимальное значение, которое при этом получается, соответствует

216 - 1. Если так рассуждать, то получается, что адрес начала сегмента может быть

только в диапазоне 0-64 Кбайт от начала оперативной памяти. Возникает вопрос,

как адресовать остальную часть оперативной памяти вплоть до 1 Мбайт с учетом

того, что размер самого сегмента не превышает 64 Кбайт. Дело в том, что в сегмент-

ном регистре содержатся только старшие 16 битов физического адреса начала сег-

мента. Недостающие младшие четыре бита 20-разрядного адреса получаются сдви-

гом значения в сегментном регистре влево на 4 разряда. Эта операция сдвигавыполняется аппаратно и для программного обеспечения абсолютно прозрачна.Получившееся 20-разрядное значение и является настоящим физическим адресом, соответствующим началу сегмента. Что касается второго компонента {смещения), участвующего в образовании физического адреса некоторого объекта в памяти, то он представляет собой 16-разрядное значение. Это значение может содержаться явно в команде либо косвенно в одном из регистров общего назначения. В процессоре эти две составляющие складываются на аппаратном уровне,в результате получается физический адрес памяти размерностью 20 битов. Дан-ный механизм образования физического адреса позволяет сделать программноеобеспечение перемещаемым, то есть не зависящим от конкретных адресов загруз-ки его в оперативной памяти (рис. 2.8).

На рисунке хорошо видно, как формируется некоторый целевой физический

адрес: сегментная часть извлекается из одного из сегментных регистров, сдвигает-

ся на четыре разряда влево и суммируется со смещением. В свою очередь, видно,

что значение смещения можно получить минимум из одного и максимум из трех

источников: из значения смещения в самой машинной команде и/или из содержи-

мого одного базового и/или одного индексного регистра. Количество источников,

участвующих в формировании смещения, определяется кодированием конкрет-

ной машинной команды, и если таких источников несколько, то значения в них

складываются. В заключение заметим, что не стоит волноваться из-за несоответ-

ствия размеров шины адреса процессора i486 или Pentium (32 бита) и 20-разряд-

ного значения физического адреса реального режима. Пока процессор находится

в реальном режиме, старшие 12 линий шины адреса попросту недоступны, хотя

при определенных условиях и существует возможность работы с первыми 64 Кбайт

оперативной памяти, лежащими сразу после первого мегабайта.

Недостатки такой организации памяти:

И сегменты бесконтрольно размещаются с любого адреса, кратного 16 (так как

содержимое сегментного регистра аппаратно смещается на 4 разряда), и, как

следствие, программа может обращаться по любым адресам, в том числе и ре-

ально не существующим;

сегменты имеют максимальный размер 64 Кбайт;

сегменты могут перекрываться другими сегментами.

Желанием ввести в архитектуру средства, позволяющие избавиться от указан-

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

в котором работают все современные операционные системы, в том числе Windows

и Linux.

Формирование физического адреса в защищенном режиме

Основная идея защищенного режима — защитить исполняемые процессором про-

граммы от взаимного влияния. В защищенном режиме процессор поддерживает

два типа защиты — по привилегиям и по доступу к памяти. В контексте нашего

изложения интерес представляет второй тип защиты. Его мы и рассмотрим.

Для введения любого механизма защиты нужно иметь как можно больше ин-

формации об объектах защиты. Для процессора такими объектами являются ис-

полняемые им программы. Организуя защиту программ по доступу к памяти, фирма

Intel не стала нарушать принцип сегментации, свойственный ее процессорам. Так

как каждая программа занимает один или несколько сегментов в памяти, то логич-

но иметь больше информации об этих сегментах как об объектах, реально суще-

ствующих в данный момент в вычислительной системе. Если каждому из сегмен-

тов присвоить определенные атрибуты, то часть функций по контролю за доступом

к ним можно переложить на процессор. Что и было сделано. Любой сегмент памя-

ти в защищенном режиме имеет следующие атрибуты:

ш расположение сегмента в памяти;

II размер сегмента;

ii уровень привилегий (определяет права данного сегмента относительно других

сегментов);

И тип доступа (определяет назначение сегмента);

и некоторые другие.

В отличие от реального режима, в защищенном режиме программа уже не мо-

жет запросто обратиться по любому физическому адресу памяти. Для этого она

должна иметь определенные полномочия и удовлетворять ряду требований.

Ключевым объектом защищенного режима является специальная структура —дескриптор сегмента, который представляет собой 8-байтовый дескриптор (крат-

кое описание) непрерывной области памяти, содержащий перечисленные ранее

атрибуты. На рис. 2.9 приведена структура дескриптор сегмента.

Приведем назначение некоторых полей дескриптора сегмента:

limit_l и limit_2 — 20-разрядное поле, определяющее размер сегмента;

base_l и base_2 — 32-разрядное поле, определяющее значение линейного адре-

са начала сегмента в памяти;

AR — байт, поля которого определяют права доступа к сегменту;

D — бит разрядности операндов и адресов (глава 3);

G — бит гранулярности.

В защищенном режиме размер сегмента не фиксирован, его расположение мож-

но задать в пределах 4 Гбайт. Если посмотреть на рисунок, то возникнет вопрос:

почему разорваны поля, определяющие размер сегмента и его начальный (базо-

вый) адрес? Это результат эволюции процессоров. Защищенный режим впервые

появился в процессоре i80286. Этот процессор имел 24-разрядную адресную шину

и, соответственно, мог адресовать в защищенном режиме до 16 Мбайт оператив-

ной памяти. Для этого ему достаточно было иметь в дескрипторе поле базового

адреса 24 бита и поле размера сегмента 16 битов. После появления процессора

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]