Файл: Литература по курсу аос (по всем вопросам должен быть представлен краткий рукописный конспект в общей тетради).docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.02.2024

Просмотров: 93

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Это делается в управляющем регистре CR0 – путем установки однобитного признака PE (Paging Enabling) в 0/1.
Итак, Пентиум работает в сегментном режиме.

  1. У него есть ВАП, поделенный на СЕГМЕНТЫ.

  2. У каждого сегмента есть описание – ДЕСКРИПТОР СЕГМЕНТА.

Формат дескриптора сегмента (размер – 8 байт)



Структура у дескриптора немного странная, это все пережитки истории.

Но в целом основные поля:

  1. База – занимает 32 бита (4 байта) – содержит базовый адрес сегмента.

На рисунке желтая, видно, что состоит из 3 частей

  1. Размер – занимает 24 бита (3 байта)

    • Поле G – единица измерения:

- 0 – байты (максимальный р-р сегмента – 64 кб)

- 1 – страницы по 4 кб

  1. 5-й байт дескриптора (в красной рамке – байт доступа). – 8 бит (1 байт)

Он содержит:

  • Бит присутствия Р (1 бит):

    • - 0 – сегмент не в памяти,

    • - 1 – в памяти

  • DPL (Descriptor Privilege Level) – уровень привилегий для доступа к дескриптору (2 бит)

  • 5 бит – поля типа сегмента:

    • - сегмент данных

    • - сегмент кода

    • - системный сегмент (GDT, TSS)

    • И способ использования сегмента (чтение, запись, выполнение)


3. Дескрипторы объединяются в ТАБЛИЦЫ ДЕСКРИПТОРОВ (2 типа):

  • Глобальная таблица дескрипторов(GDT) – сегменты межпроцессного взаимодействия, сегменты ОС, общие сегменты для всех процессов

  • Локальная таблица дескрипторов (LDT) – у каждого процесса своя.

  • (IDT – Interrupt Descriptor Table – таблица дескрипторов прерываний – используется системой прерываний для их обработки)

GDT – одна

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

Таблицы GDT и LDT размещены в памяти в виде отдельных сегментов.

Таблица GDT кроме всего прочего, хранит в себе данные о себе самой и обо всех LDT.
Адреса GDT и LDT хранятся в регистрах системных адресов GDTR и LDTR соответственно.

В GDTR хранится 32 разрядный физический адрес



В LDTR – индекс дескриптора в таблице GDT, а уже адрес нужной LDT берется из этой записи.

Итак, процесс обратился за памятью. Что происходит?

У него есть СЕЛЕКТОР и СМЕЩЕНИЕ.

  • Селектор определяет ВИРТУАЛЬНЫЙ СЕГМЕНТ.

  • Смещение – понятно.




  • Селектор помещается в один из СЕГМЕНТНЫХ РЕГИСТРОВ процесса

Структура этого селектора:



А) Индекс(номер в таблице) (13 бит) – всего сегментов может быть 2 13 (8 килобайт) каждого типа, т.е. 16 килобайт (2 16). 16Кбайт * 4 Гбайта = 64 Тбайт – максимальный размер ВАП. До фига, в общем.

Б) Таблица, где его искать: глобальная или локальная (1 бит)

В) Требуемый уровень привилегий, чтобы с ним работать RPL (2 бита)


  • Смещение задается МАШИННОЙ ИНСТРУКЦИЕЙ (под него отведено 32 бита – отсюда максимальный размер сегмента – 4 Гига)


Вариант 1: оказалось, что нужный сегмент – в GDT:

  • Адрес GDT взят из регистра GDTR

  • Сложили базовый адрес с индексом сегмента, сдвинутым на 3 разряда влево (зачем, я не въехала, но не суть)

  • Получили ФИЗИЧЕСКИЙ АДРЕС ДЕСКРИПТОРА СЕГМЕНТА

  • Извлекли дескриптор из памяти:

    • - проверили, не больше ли смещение величины сегмента (если чего - прерывание)

    • - проверили права доступа – (если чего, прерывание)

    • - проверили, есть ли он в памяти (бит присутствия Р) – если чего, ну, вы поняли.

  • Если все хорошо – приплюсовали смещение и радуемся.


Вариант 2: оказалось, что нужный сегмент – в LDT:

  • Добываем базовый адрес таблицы LDT из GDT и LDTR

  • Ну а дальше все по накатанной.


Таким образом, ОС, работая на Пентиуме должна всего лишь:

- сформировать таблицы GDT и LDT

- загрузить GDT в оперативу

- загрузить указатели на них в регистры GDTR и LDTR

- выключить поддержку страничной адресации
Все. Все остальное делает процессор САМ:

  • быстро аппаратно преобразует виртуальные адреса в физические

  • гарантирует защиту данных

А вот про защиту – это уже другая история, а именно - следующий вопрос.


  1. Защита данных в системах с сегментной организацией памяти на основе процессоров с архитектурой IA32.


Процессор Пентиум, при работе в защищенном режиме, предоставляет ОС средства защиты процессов друг от друга:
1) Отдельная таблица дескрипторов для каждого процесса (LDT) – и ее начальный адрес заносится в регистр LDTR на этапе загрузки процесса в память.



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

  • У каждого сегмента есть атрибуты безопасности, определяющие степень защищенности этого сегмента

  • У каждого процесса есть атрибуты привилегий этого процесса


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

Среди самых привилегированных инструкций (доступных только процессу с наивысшим приоритетом):

  • Останов процессора

  • Загрузка регистра GDTR и LDTR


4) Ограничения на способ использования сегмента (сегмент данных, кодовый сегмент, системный сегмент – некоторые действия для них запрещены – нельзя в кодовый сегмент писать данные и нельзя передавать сегменту данных управление)

А подробнее так:

Способ использования, как мы помним, закодирован несколькими битами 5-го байта дескриптора (который в рамочке):

  • 7-й бит 5-го байта – Р – бит присутствия

  • 6-й и 5-й – хранят DPL (уровень привилегий)

  • 4-й по 0-й – кодируют тип сегмента (см рисунок)




Бит S – кодирует ТИП дескриптора (cистемный или нет):

  • Системный (0) – например LDT или TSS – конкретный тип указан в его младших битах

  • Данные или Код (1)

Бит E – для отличия сегмента данных (0) от сегмента кода (1)
Для сегмента ДАННЫХ:

  • ED Expand Down– направление распространения сегмента:

    • 0 – к увеличению адресов

    • 1 – к уменьшению адресов

  • W – writeable – бит разрешения записи в сегмент (1 – можно, 0 - нельзя)

  • A – accessed – признак обращения (фиксация обращения к молю, может использоваться в алгоритме замещения сегментов в ОП)


Для сегмента КОДА:

  • С - conforming – бит подчинения сегмента:

    • 0 – неподчиненный сегмент, можно вызвать только при CPL = DPL

    • 1 – подчиненный сегмент, можно вызвать при CPL >= DPL

  • R – readable – бит разрешения чтения (1 – можно, 0 - нельзя)

  • A – accessed – признак обращения (фиксация обращения к молю, может использоваться в алгоритме замещения сегментов в ОП)




  1. При попытке сделать какую-то операцию – проверка допустимости операции (при загрузке сегмента в регистр, чтобы не загружали сегменты данных в регистры кода и тд).

  2. Проверка ссылок операндов чтобы не

  • Не читали данные из сегмента кода (он только выполняется)

  • Не писали данные в кодовые сегменты

  • Не писали данные в сегмент, откуда можно только читать


Привилегии подробнее:

В процессоре Пентиум – МАНДАТНЫЙспособ определения прав доступа (механизм колец защиты):



Есть 4 уровня привилений:

0 – ядро

1, 2 – системные утилиты

3 – прикладные проги
Для характеристики уровня привилегий есть несколько переменных:

  • DPL – Descripror Privilege Level – (DPL –поле в дескрипторе сегмента – в таблице дескрипторов)

  • RPL – Request Privilege Level – (RPL – поле в селекторе сегмента (то, с чем мы запрашиваем память))

  • СPL – Current Privilege Level – (RPL – поле в селекторе кодового сегмента (то, что сейчас выполняется))

  • EPL – Effective Privilege Level – эффективный уровень привилегий запроса. Что это?

Уровни привилегий назначаются дескрипторам и селекторам. В любом случае это 2 бита: 00 01 10 11. Основное из чего оно вычисляются все переменные – DPL.
При остановке процесса уровень привилегий процесса сохраняется в его контексте. В Процессоре Пентиум это записывается в системный сегмент TSS – task state segment

Контроль доступа:

- к сегментам данных

Сопоставление EPL запроса и DPL сегмента данных:

EPL = max (RPL, CPL) - худшее

CPL – привилегии выполняемого кода

RPL – это привилегии, с которыми запрашиваем данные

DPL – привилегии, с которыми данные могут быть запрошены

- к сегменту стека

Предотвратить доступ низкоуровневого кода к данным, выработанным высокоуровневым кодом и помещенным в стек

EPL кода = DPL сегмента стека, тогда разрешен доступ

Т.е. для каждого уровня привилегий используется отдельный сегмент стека.

- к сегменту кода

CPL сравниваем с DPL, а как именно – все сложно.



  1. Смешанная сегментно-страничная организация памяти в системах на основе процессоров с архитектурой IA32. Трансляция адреса. Буфер ассоциативной трансляции (TLB).


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

  • ВАП процесса ограничивается размером 4 Гб

  • Оно делится на витруальные сегменты

  • Виртуальные сегмены могут накладываться друг на друга (процессор это не контролирует, это забота ОС)

  • ВАП и ФАП разбиты на страницы размером 4 кб

  • Всего страниц – 1 Мб, 2 20 степени


Виртуальный адрес – это СЕЛЕКТОР + СМЕЩЕНИЕ.

1 этап преобразования: сегментный:

  • На основании индекса селектора берем нужный дескриптор из GDT или LDT

  • Из дескриптора добываем базовый адрес сегмента

  • Но! Базовый адрес дескриптора здесь – это базовый адрес сегмента в ВАП а не в ФАП как в сегментной организации.

  • Плюсуем к базовому адресу смещение = Линейный Виртуальный Адрес.

ЛВА передаем страничному механизму.


2 этап – страничный.

  • ЛВА на основании размера страницы делим на номер страницы и смещение

  • Находим в таблице страниц нужный дескриптор

  • Находим номер физической страницы

  • Плюсуем смещение

Вот как выглядит дескриптор страницы в таблице страниц


P – бит присутствия в физической памяти

W – бит разрешения записи

U – бит пользователь / супервизор

A – к странице был доступ

D – признак модификации

PWT и PCD – управление механизмом кэширования

AVL – резерв для нужд ОС
Страницы маленькие, их много, и таблица страниц занимает целых 4 метра. Это до фига, поэтому страницы группируются в разделы, с формированием таблиц раздела = размеру страницы.