Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 800330

.pdf
Скачиваний:
3
Добавлен:
01.05.2022
Размер:
1.64 Mб
Скачать

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

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

3.4.2. Дисциплина VSWS (Variable-interval Sampled Working Set) – управление резидентным множеством на основе локальной политики замещения

Дисциплина VSWS уменьшает задержку при сокращении резидентного множества страниц процесса за счет перехода к локальному замещению.

Сущность дисциплины VSWS состоит в следующем. Всякий раз при возникновении страничной ошибки к резидентному множеству процесса добавляется новый страничный кадр.

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

71

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

1) с момента начала накопления данных об обращениях к памяти в процессе произошло более страничных ошибок, при условии, что длительность интервала накопления данных составила не менее единиц виртуального времени процесса;

2) с момента начала накопления

данных об

обращениях к памяти прошло более

единиц виртуального

времени процесса.

 

 

При этом значения параметров

, и

выбирают

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

72

4. АППАРАТНАЯ ПОДДЕРЖКА ВИРТУАЛЬНОЙ ПАМЯТИ В ПРОЦЕССОРАХ С АРХИТЕКТУРОЙ X86-64

Процессоры с архитектурой x86-64 в настоящее время являются наиболее распространенными в персональных компьютерах и ноутбуках. Архитектура x8664 является 64-битным расширением архитектуры Intel x86, которая развивалась с 1978 года (процессор Intel 8086). За почти 40 лет существования архитектуры x86 процессоры прошли значительный путь развития: добавлялись новые команды и режимы работы, увеличивалась разрядность, но всегда сохранялась совместимость с предыдущими поколениями процессоров, что и позволяет причислить столь разные процессоры, выпускающиеся почти 40 лет, к одной архитектуре.

Поддержка виртуальной памяти в рамках архитектуры x86 впервые была реализована в 1982 годы в посессоре Intel 80286 и включала только сегментную модель. Поддержка страничного механизма появилась в 1985 году в процессоре Intel 80386, первом 32-битном процессоре в линейке x86. Основные принципы, заложенные в этом процессоре, в том числе механизмы поддержки виртуальной памяти, без кардинальных изменений дошли до настоящего времени.

Расширение 32-битной архитектуры x86 до 64битной архитектуры x86-64 предложено компанией AMD и впервые реализовано в процессоре AMD Opteron в 2003 году, а затем стало использоваться и в процессорах Intel. При этом расширение разрядности выполнено таким образом, что процессор может одновременно поддерживать 64-битные и 32-битные ВАП в различных процессах,

73

исполняя 32-битные и 64-битные программы без потери эффективности.

Архитектура x86-64 обеспечивает поддержку сегментной и сегментно-страничной моделей виртуальной памяти и несколько режимов трансляции адресов, в том числе совместимых с предыдущими поколениями процессоров.

4.1. Сегментный механизм

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

Процессор поддерживает 6 сегментов, для описания которых предназначены 6 сегментных регистров: CS – сегмент кода, DS – сегмент данных по умолчанию, SS – сегмент стека, ES, GS, FS – дополнительные сегменты данных.

В 32-битном режиме размер сегментных регистров 96 бит, 16 из которых доступны программно. Эту 16-битную часть сегментного регистра называют селектор сегмента. Старшие 80 бит сегментного регистра используются в качестве буфера трансляции. При изменении селектора сегмента, в эту часть сегментного регистра автоматически копируется базовый адрес и атрибуты сегмента из таблицы дескрипторов. После чего для трансляции виртуального адреса в физический уже не требуется лишнее обращение к памяти (к записи таблицы дескрипторов).

74

 

Сегментный регистр (96 или 128 бит)

 

 

 

Селектор сегмента (16 бит)

 

 

13

1

2

 

 

Индекс (SI)

TI

RPL

Адрес (32 или 64 бита)

 

GDT - Global Descriptor Table

Физический адрес

GDTR

(32 или 52 бита)

адрес

 

 

 

 

 

 

 

 

адрес

 

 

 

 

адрес

 

 

 

 

LDT - Local Descriptor Table

 

LDTR

адрес

 

 

 

 

 

 

 

 

адрес

 

 

 

 

адрес

 

 

 

Рис. 17. Трансляция адресов при использовании сегментной модели виртуальной памяти

75

В64-битном режиме регистры DS, ES и SS не используются. При этом трансляция адресов выполняется так, как будто начальный адрес сегмента в физической памяти равен нулю, а размер сегмента перекрывает все адресное пространство. Также (т.е. относительно нулевого базового адреса) в 64-битном режиме выполняется трансляция адресов сегмента кода. При этом регистр CS в 64-битном режиме остается 96-битным, как и в 32-битном режиме, но поле базового адреса сегмента в 64-битном режиме игнорируется.

Регистры GS и FS в 64-битном режиме становятся 128-битными. При этом при установке селектора сегмента из таблицы дескрипторов в сегментный регистр скопируются только атрибуты сегмента, а 64-битный базовый (начальный) адрес сегмента должен быть явно записан в сегментный регистр.

Впроцессорах архитектуры x86 используется два типа таблиц дескрипторов (таблиц трансляции адресов):

глобальная таблица дескрипторов (GDT) и локальная таблица дескрипторов (LDT). При этом индекс (номер)

сегмента из селектора сегмента применяется и к GDT и к LDT. Из какой таблицы будут выбраны данные в сегментный регистр, определяет поле TI (Table Index). Если

=0, то выбираются данные из GDT, в противном случае

из LDT.

Физический начальный адрес GDT в ОЗУ (64-битный или 32-битный, в зависимости от режима работы) должен быть записан в регистр процессора GDTR.

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

76

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

будет выставляться

 

.

Формат

дескриптора сегмента в таблицах GDT и LDT

 

= 1

 

в 32-битном режиме работы процессора одинаковый и показан на рис. 18.

Размер дескриптора сегмента в таблице GDT составляет 8 байт. Дескриптор содержит несколько флагов и

полей данных.

 

 

 

 

 

 

 

Флаг G (Granularity) – определяет трактовку поля

размер сегмента. Если

 

, то размер сегмента задан в

байтах, а если

– то в=4

Кбайт страницах.

 

 

 

0

 

 

 

 

 

 

(Default operand size) определяет 16-битный

 

Флаг D/B= 1

 

 

 

/

= 0

 

или 32-битный режим адресации в сегменте. Если

,

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

 

– 32-битый. Если сегмент данных используется в

качестве

/

= 1

стека (индексируется через сегментный регистр SS), то при

16/-

= 0

в качестве указателя стека будет использоваться

 

 

 

битный регистр SP, иначе – 32-битный регистр ESP.

 

 

 

Флаг AVL

может

устанавливаться и

читаться

программно, но не влияет на работу процессора. Операционная система может использовать этот бит по своему усмотрению для маркировки сегментов.

77

Рис. 18. Формат дескриптора сегмента в 32-битном режиме

78

Флаг P (Present) – флаг присутствия сегмента в ОЗУ. Он устанавливается и сбрасывается операционной системой. Процессор проверяет флаг P при каждой трансляции адреса. Если = 1, то операционная система гарантирует нахождение данных в ОЗУ и возможность обращения к ним. Если операционная система выгружает сегмент на диск, она сбрасывает флаг присутствия. Если = 0, то при попытке обратиться к этому сегменту процессор генерирует исключение. При возникновении такого исключения во время выполнения программы, операционная система должна будет загрузить требуемый сегмент в ОЗУ, установить корректный базовый адрес в дескрипторе сегмента и установить флаг P, после чего выполнение программы может быть продолжено.

Поле DPL (Descriptor Privilege Level) – определяет уровень привилегии, необходимый для доступа к сегменту, в том числе для исполнения кода. Архитектурой x86 определяется 4 уровня привилегий: 0 – самый высокий, обеспечивающий полный доступ ко всем аппаратным и программным ресурсам (нужен для обработки прерываний, управления памятью, распределения дискового пространства и др. критически важных задач), 1 и 2 – менее привилегированные (предназначены для работы драйверов, но большинство операционных систем их не использует и исполняет код драйверов на уровне 0), 3 – самый низкий, не дающий доступа к аппаратуре (предназначен для работы прикладных программ).

Процессор оперирует тремя уровнями привилегий: DPL – уровень привилегии, необходимый для доступа к сегменту, RPL – запрашиваемый программой уровень привилегий для доступа к сегменту и CPL (Current Privilege Level) – текущий уровень привилегий, характеризующий уровень привилегий исполняемой программы (обычно, но

79

не всегда, CPL соответствует DPL сегмента, содержащего программный код). Процессор сопоставляет DPL, CPL и RPL при модификации селектора сегмента, при вызове функций, при выполнении безусловных переходов и в ряде других случаев. Алгоритмы сопоставления разные в разных случаях. Иногда при передаче управления (вызов функций, обработка прерываний или исключений, переключение процессов) CPL может изменяться.

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

=

= Сегмена Стека.

Если это условие не выполняется, процессор генерирует исключение нарушения прав доступа.

Проверка возможности доступа к сегменту данных выполняется на этапе загрузки дескриптора сегмента из таблицы дескрипторов в регистр DS, ES, FS или GS. Доступ к сегменту будет разрешен (процессор загрузит дескриптор сегмента в сегментный регистр), если ( , ) ≤

. В противном случае процессор генерирует исключение нарушения прав доступа.

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

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

80