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

Лекция №4. Архитектура памяти. Управление памятью. Mdl. Выделение памяти. Отображение памяти. [4.1] Организация памяти в защищенном режиме работы процессора

На лекции №2 мы кратко рассмотрели работу процессоров серии i386 и выше в защищенном режиме, использующем организацию памяти, при которой используются 2 механизма преобразования памяти:

  • сегментация

  • разбиение на страницы.

ОС NT в различной мере использует оба этих механизма.

(Также см лекцию №2) При работе в защищенном режиме процессор поддерживает три типа дескрипторных таблиц: глобальная дескрипторная таблица (GDT), локальная дескрипторная таблица (LDT) и дескрипторная таблица прерываний (IDT).

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

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

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

В глобальной дескрипторной таблице и каждой локальной дескрипторной таблице может быть определено до 213 (8192) сегментов. Каждый сегмент может иметь размер до 4 Гб (232 байт). Таким образом, максимальный размер виртуального адресного пространства составляет 64Тб.

Каждый сегмент описывается 8-байтной структурой данных – дескриптором сегмента. Дескрипторы находятся в таблице дескрипторов. Для указания конкретного сегмента используется 16-битный селектор. Он является индексом внутри таблицы дескрипторов. Младшие 2 бита селектора определяют номер привилегированного режима, который может воспользоваться данным селектором для доступа к дескриптору (RPL - Requested Privilege Level). Третий бит определяет локальную/глобальную дескрипторную таблицу, в которой следует искать дескриптор (TI - Table Indicator). Остальные 13 старших бит являются индексом в соответствующей дескрипторной таблице (отсюда max число селекторов в дескрипторной таблице 213 или 8192).

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

  • Базовый адрес сегмента - 32-разрядное значение, определяющее начальный адрес сегмента в 4Гб адресном пространстве.

  • Предел - 20-разрядное поле, равно размеру сегмента минус 1. Единицами измерения размера являются либо байты, либо 4 Кб страницы, в зависимости от значения бита гранулярности. Таким образом, максимальное значение предела составляет 220 страниц, что при размере страницы 4 Кб (212) дает 232 байт, т.е. 4 Гб.

  • Бит гранулярности - определяет единицу измерения предела сегмента.

  • права доступа, среди которых нас наиболее интересует двухбитное поле уровень привилегий дескриптора (DPL) и трехбитное - способ использования сегмента (Type). DPL определяет уровень привилегий описываемого дескриптором сегмента (4-х уровневая система привилегий - кольца защиты 0-3). Восемь типов сегментов, определяемых полем type, отличаются комбинациями прав чтения/записи/исполнения.

Рис. 1

Защита сегментов по привилегиям состоит в следующем. Исполняющийся в данный момент код имеет некоторый уровень привилегий, называемый текущим уровнем привилегий (CPL). Он определяется полем RPL селектора в регистре CS (регистр, определяющий селектор исполняющегося в данный момент кода.). Код с некоторым уровнем CPL имеет право:

  • обращаться к данным в сегменте с DPL сегмента >= CPL кода

  • передать управление коду в сегменте с DPL сегмента строго = CPL кода

ОС NT, хотя и использует селекторы, но использует их в минимальной степени.

NT реализует плоскую 32-разрядную модель памяти с размером линейного адресного пространства 4 Гб (232 байт). Как это сделано?

В NT определено 11 селекторов, из которых нас будут интересовать всего 4:

Селектор

Hex (bin)

Назначение (RPL)

база

предел

DPL

тип

08 (001000)

Code32 (kernel)

00000000

FFFFFFFF

0 (kernel)

RE

10 (010000)

Data32 (kernel)

00000000

FFFFFFFF

0 (kernel)

RW

1b (011011)

Code32 (user)

00000000

FFFFFFFF

3 (user)

RE

23 (100011)

Data32 (user)

00000000

FFFFFFFF

3 (user)

RW

Эти 4 селектора позволяют адресовать все 4Гб линейного адресного пространства, причем для всех селекторов при фиксированном контексте памяти производится трансляция в одни и те же физические адреса. Разница только в режиме доступа.

Первые 2 селектора имеют DPL=0 и используются драйверами и системными компонентами для доступа к системному коду, данным и стеку. Вторые 2 селектора используются кодом пользовательского режима для доступа к коду, данным и стеку пользовательского режима. Эти селекторы являются константами для ОС NT.

Сегментное преобразование пары селектор:смещение дает 32-битный линейный адрес (лежащий в диапазоне 4Гб линейного адресного пространства). При этом линейный адрес совпадает со значением смещения виртуального адреса. Фактически, при такой организации памяти виртуальный и линейный адреса совпадают.

Примечание.

Наличие поля тип, определяющего возможность чтения/записи/исполнения кода в соответствующем сегменте может навести на мысль, что именно на этом уровне производится защита памяти от нецелевого использования. Например, при работе прикладной программы в пользовательском режиме ее код находится в сегменте с селектором 1b. Для этого сегмента разрешены операции чтения и исполнения. Используя селектор 1b, программа не сможет модифицировать свой собственный код. Однако, как уже было сказано, для всех сегментов производится трансляция в одни и те же физические адреса. Поэтому при обращении к данным или стеку (селектор 23) прикладная программа обнаружит свой код по тому же смещению, что и для селектора 1b, причем режим доступа к сегменту позволяет производить чтение/запись. (При этом важно помнить: одно и то же смещение в разных адресных пространствах указывает на разную физическую память.) Таким образом, способ использования сегментации в ОС NT не обеспечивает защиту кода от нецелевого использования.

Далее задействуется механизм страничной организации памяти и переключения контекста памяти.

Каждый контекст памяти (адресное пространство процесса) описывается своим каталогом страниц.

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

Таким образом, механизм защиты страниц использует всего 2 уровня привилегий - 0 (ядро) и 3 (пользователь)

Кроме того, каждый элемент таблицы страниц содержит бит, указывающий на возможность записи в соответствующую страницу памяти (0 - доступ только на чтение, 1 - чтение/запись). Чтение возможно всегда, когда разрешен доступ по привилегиям.

Эти два бита используются для управления доступом к страницам памяти и формируют следующий набор правил:

  • страница всегда может быть прочитана из режима ядра;

  • на страницу может быть произведена запись из режима ядра, только если установлен бит разрешения записи;

  • страница может быть прочитана из пользовательского режима, только если установлен бит доступа к странице из пользовательского режима;

  • на страницу может быть произведена запись из пользовательского режима, если установлены оба бита (разрешение записи и доступ из пользовательского режима);

  • если страница может быть прочитана, она может быть исполнена.

Примечание.

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

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

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

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

Соответственно, диапазон виртуальных адресов 2-4Гб называют системным адресным пространством (system address space), а диапазон 0-2Гб – пользовательским адресным пространством (user address space).

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

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

Соседние файлы в папке Лабы по драйверам