Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12-12-2013_11-21-32 / пособие_m.doc
Скачиваний:
76
Добавлен:
10.05.2015
Размер:
484.35 Кб
Скачать
    1. 2.5. Сегментная организация памяти

В микропроцессорах семейства Intel используется сегментированная память. При этом вся оперативная память делится на участки со смежными адресами, которые и называются сегментами. Каждый сегмент имеет собственное предназначение. Во-первых, в памяти располагается кодовый сегмент, который предназначен для хранения кода программы. Для хранения данных, используемых выполняемой программой, в памяти имеется основной и дополнительные сегменты данных, а для организации стека – стековый сегмент.

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

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

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

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

Реальный режим (Real mode) полностью соответствует работе микропроцессора 8086. Этот микропроцессор является 16-разрядным (т.е. все регистры этого микропроцессора имеют разрядность 16), а адресная шина имеет разрядность 20, что позволяет ему обращаться к адресному пространству равному 1 Мбайту. В этом режиме базовый адрес сегмента определяется следующим образом: 16-разрядное содержимое сегментных регистров сдвигается влево на 4 разряда (т.е. с правой стороны добавляются 4 нуля) и, таким образом, образуется 20-разрядный адрес.

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

В защищенном режиме (Protected mode) определение базового адреса сегмента осуществляется также при помощи сегментных регистров, однако делается это определение другим способом. Для каждого сегмента имеется специальная структура данных, которая описывает этот сегмент и которая называется дескриптором. Этот дескриптор содержит базовый адрес сегмента, его размер, тип сегмента (определяющий его использование) и дополнительную информацию (права этого сегмента). Размер дескриптора составляет 8 байт. Из этих 8 байт 4 байта определяют базовый адрес сегмента, а 20 бит определяют его размер.

Дескрипторы размещаются в памяти и эта область памяти называется дескрипторной таблицей. Основной таблицей дескрипторов является глобальная дескрипторная таблица (Global Descriptor Table – GDT), которая предназначена для использования всеми программами. На расположение этой таблицы в памяти указывает специальный регистр GDTR, который имеет разрядность 48 бит, из которых 32 бита используются для указания базового адреса этой таблицы, а 16 разрядов определяют размер таблицы.

Для определения требуемого дескриптора используется содержимое сегментного регистра, вернее, его 13 старших разрядов (разряды с 3 по 15). Значение этих разрядов называется индексом. Поскольку каждый дескриптор содержит 8 байт, то значение индекса умножается на 8 (т.е. справа к значению индекса добавляется 3 нуля) и полученное значение прибавляется к базовому адресу таблицы. Полученная сумма и будет являться адресом дескриптора.

После определения дескриптора микропроцессор определяет базовый адрес сегмента и может осуществлять обращение к памяти. Количество дескрипторов в таблице GDT равно 213 , т.е. является достаточно большой величиной, однако если для какой-либо задачи количество дескрипторов является недостаточным, то она может организовать собственную таблицу дескрипторов, которая называется локальной таблицей дескрипторов (LDT – Local Descriptor Table).

Расположение этой таблицы (ее базовый адрес и предел) описано в дескрипторе, который хранится в глобальной таблице, а для указания того, где расположен этот дескриптор, используется специальный 16-разрядный регистр LDTR. При помощи 13 старших разрядов этого регистра микропроцессор определяет расположение этого дескриптора в таблице GDT, после чего он имеет возможность работать с этой локальной таблицей.

Для указания того, с какой таблицей - локальной или глобальной – должен работать микропроцессор, указывает 2 разряд в селекторе сегмента. Этот разряд обозначается TI (Table Indicator) и если его значение равно 0, то обращение производится к глобальной таблице; если же значение этого разряда равно 1, то обращение происходит к локальной дескрипторной таблице.

Для того, чтобы определить базовый адрес сегмента, микропроцессор должен несколько раз обратиться к памяти. Очевидно, что при этом уменьшается производительность микропроцессора, причем в достаточно большой степени. Чтобы избежать этого, в микропроцессоре имеются ассоциированные регистры, предназначенные для хранения дескрипторов. Длина этих регистров равна 8 байтам и они называются теневыми, поскольку эти регистры являются недоступными для программистов. Эти 8-байтные регистры ассоциируются с сегментными регистрами и регистром LDTR.

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

Кроме базового адреса сегмента и предела дескриптор содержит байт прав доступа (Access Right), в связи с чем этот байт называется байтом AR. Формат этого байта показан на рис.2.

Седьмой разряд P в этом байте называется битом присутствия и он обозначает (если этот разряд равен 1), что данный дескриптор находится в памяти. Разряды 6 и 5 называются разрядами DPL (Descriptor Privilege Level) и они указывают уровень привилегий данного сегмента.

Четвертый разряд показывает, относится ли данный дескриптор к сегменту, или же он характеризует системный объект (например, локальную таблицу дескрипторов): если этот разряд равен 1, то данный дескриптор относится к сегменту.

Рис.2 Формат байта прав доступа

Третий разряд указывает, какой сегмент представляет данный дескриптор: единичное значение этого разряда означает, что данный сегмент является кодовым сегментом, а нулевое значение – что данный сегмент является сегментом данных (или сегментом стека).

Для кодового сегмента второй разряд называется разрядом согласования С, а первый разряд называется разрядом разрешения считывания R (Read) и показывает возможность считывания кода из этого сегмента (если этот разряд равен 1) как данных. Для сегментов данных единичное значение первого разряда W показывает возможность осуществления записи в этот сегмент, а единичное значение второго разряда ED показывает, что данный сегмент является сегментом стека.

Различие между сегментом данных и стековым сегментом заключается в том, что в сегментах данных адресуемый диапазон простирается от базового адреса до базового адреса плюс предел (который указан в дескрипторе), т.е. смещения могут изменяться от 0 до предела. Если смещение оказывается больше предела, то в процессоре возникает внутренняя исключительная ситуация, т.е. особый случай защиты.

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

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

Через регулярные промежутки времени операционная система сканирует все дескрипторы и сбрасывает их биты А в нуль. Если во время сканирования обнаруживаются дескрипторы с битами А=1, то это означает, что после предыдущего сканирования к этим дескрипторам были обращения, поскольку когда селектор дескриптора загружается в сегментный регистр этот разряд автоматически устанавливается в единицу. Таким образом, операционная система узнает, какой сегмент использовался наиболее давно и этот сегмент можно удалить.

Соседние файлы в папке 12-12-2013_11-21-32