Лекция №11
Защищенный
режим работы микропроцессора
(продолжение)
Вопросы:
1. Повторение ключевых моментов
2. Поддержка сегментированной модели памяти
· Дескрипторные таблицы
· Формат селектора сегмента (сегментного регистра)
· Формат дескриптора сегмента
3. Поддержка страничной модели памяти
· Таблицы страниц
· Формат дескриптора страницы
4. Переход микропроцессора в защищенный режим
Структуры
данных защищенного режима
Повторение ключевых моментов
Мы уже отмечали, что физический адрес в защищенном режиме вычисляется по правилам, отличным от реального режима.
Кроме того, в
защищенном режиме любой запрос к памяти как со стороны операционной системы,
так и со стороны прикладных программ должен быть санкционирован. Микропроцессор
аппаратно контролирует доступ
программ к любому адресу в оперативной памяти.
! |
В защищенном режиме всегда действует сегментный способ организации распределения памяти. Кроме того, может быть включен и страничный механизм (страничная трансляция).
Поддержка сегментированной модели памяти
Дескрипторные таблицы
Микропроцессор аппаратно поддерживает три типа дескрипторных таблиц:
· глобальная дескрипторная таблица (GDT);
· локальная дескрипторная таблица (LDT);
· таблица дескрипторов прерываний (IDT).
1. Таблица GDT (Global Descriptor Table) — глобальная дескрипторная таблица. Это основная общесистемная таблица, к которой допускается обращение со стороны программ, обладающих достаточными привилегиями. Расположение таблицы GDT в памяти произвольно; оно локализуется с помощью специального регистра gdtr (48 бит). В таблице GDT могут содержаться следующие типы дескрипторов:
· дескрипторы сегментов кодов программ;
· дескрипторы сегментов данных программ;
· дескрипторы стековых сегментов программ;
· дескрипторы TSS (Task Segment Status) — специальные системные объекты, называемые сегментами состояния задач;
· дескрипторы для таблиц LDT;
· шлюзы вызова;
· шлюзы задач.
2. Таблица LDT (Local Descriptor Table) — локальная дескрипторная таблица. Для любой задачи в системе может быть создана своя дескрипторная таблица подобно общесистемной GDT. Для связи между таблицами GDT и LDT в таблице GDT создается дескриптор, описывающий область памяти, в которой находится LDT. Расположение таблицы LDT в памяти также произвольно и локализуется с помощью специального регистра ldtr (16 бит). В таблице LDT могут содержаться следующие типы дескрипторов:
· дескрипторы сегментов кодов программ;
· дескрипторы сегментов данных программ;
· дескрипторы стековых сегментов программ;
· шлюзы вызова;
· шлюзы задач.
3. Таблица IDT (Interrupt Descriptor Table) — дескрипторная таблица прерываний. Данная таблица также является общесистемной и содержит дескрипторы специального типа, которые определяют местоположение программ обработчиков всех видов прерываний. В качестве аналогии можно привести таблицу векторов прерываний реального режима. Расположение таблицы IDT в памяти произвольно и локализуется с помощью специального регистра idtr (48 бит). Элементы данной таблицы называются шлюзами. Отметим, что эти шлюзы бывают трех типов:
·
шлюзы задач;
· шлюзы прерываний;
· шлюзы ловушек.
Каждая из дескрипторных таблиц может содержать до 8192 (213) дескрипторов.
Формат селектора сегмента
В защищенном режиме иначе интерпретируется содержимое сегментных регистров.
Теперь в них содержатся не адреса начала сегмента, а номер соответствующего сегмента (индекс, или селектор) в таблице дескрипторов сегментов. Поэтому теперь сегментные регистры называются селекторами сегментов.
Каждый регистр разбивается на три поля:
· индекс (старшие 13 битов) - Index. Определяет номер сегмента (индекс) в соответствующей таблице дескрипторов.
· индикатор таблицы сегментов - TI (бит 2). Определяет в глобальной или локальной таблице находится дескриптор сегмента: TI=0 - в глобальной, TI=1 - в локальной.
· Уровень привилегий (биты 0 и 1). Указывает запрашиваемый уровень привилегий.
Формат дескриптора сегмента
Каждый сегмент описывается соответствующим дескриптором сегмента.
Структурно дескриптор сегмента представляет собой 8-байтовую структуру.
И состоит из следующих полей:
Номер байта Количество Символическое
Назначение и содержание полей
в
дескрипторе бит в поле обозначение дескриптора
0...1
16 limit_l Младшие биты 0...15 20-разрядного поля предела сегмента, который определяет размер сегмента
в единицах, определяемых битом гранулярности g
2...4 23 base_l Биты О...23 32-разрядной базы сегмента, которая определяет значение линейного адреса начала
сегмента в памяти
5 8 AR Байт, поля которого
определяют права доступа к сегменту
6
0...3
limit_2 Старшие биты 16...19 20-разрядного предела
сегмента
6 1 U Бит пользователя
(User). He
имеет специального
назначения и может использоваться по усмотрению
программиста
6 1 - 0 — бит не используется
6
1
D Бит
разрядности операндов и адресов:
О — в
программе используются 16-разрядные операнды и
режимы 16-разрядной адресации;
1 — в программе используются 32-разрядные операнды и
режимы
32-разрядной адресации
6
1 G Бит гранулярности:
О — размер сегмента равен значению в поле limit в байтах;
1 — размер сегмента равен значению в поле limit в страницах
7
8 base_2
Биты 24...31 32-разрядной базы сегмента
Обратим внимание на следующее
· в защищенном режиме размер сегмента не фиксирован, его расположение можно задать в пределах 4 Гбайт.
· поля, определяющие размер сегмента и его начальный (базовый) адрес разорваны, в целях совместимости со старыми микропроцессорами
дело в том, что защищенный
режим впервые появился в микропроцессоре i80286. Этот микропроцессор имел
24-разрядную адресную шину и, соответственно, мог адресовать в защищенном
режиме до 16 Мбайт оперативной памяти. Для этого ему достаточно было иметь в
дескрипторе поле базового адреса 24 бита и поле размера сегмента 16 бит. После
появления микропроцессора i80386 с 32-разрядной шиной команд и данных в целях
совместимости программ разработчики не стали изменять формат дескриптора, а
просто использовали свободные поля. Внутри микропроцессора эти поля объединены.
Внешне же они остались разделены, и при программировании с этим приходится
мириться.
· размер сегмента в защищенном режиме может достигать 4 Гбайт, то есть занимать все возможное физическое пространство памяти.
Как это возможно, если
суммарный размер поля размера сегмента всего 20 бит, что соответствует величине
1 Мбайт? Секрет скрыт в поле гранулярности
— бит G. Если бит G=0, то значение в поле размера сегмента означает размер
сегмента в байтах, а если G=1, то в
страницах. Размер страницы составляет 4 Кбайт. Нетрудно подсчитать, что когда
максимальное значение поля размера сегмента составляет Ofrfffh, то это соответствует 1 М
страниц, что и соответствует величине 1 М * 4 Кб = 4 Гб.
Таким образом, первый тип защиты - по уровню доступа - реализуется в защищенном режиме благодаря тому, что информация о базовом адресе сегмента и его размере выведена на уровень микропроцессора Þ это позволяет аппаратно контролировать работу программ с памятью и предотвращать обращения по несуществующим адресам либо по адресам, находящимся вне предела, разрешенного полем размера сегмента (limit).
Другой тип защиты - по привилегиям - заключается в том, что сегменты неравноправны в правах доступа к ним. Суть этого механизма защиты по привилегиям заключается в том, что конкретный сегмент может находиться на одном из четырех уровней привилегированности с номерами 0, 1, 2 и 3. Самым привилегированным является уровень 0. Существует ряд ограничений на взаимодействие сегментов с различными уровнями привилегий.
Информация о правах доступа к сегменту содержится в специальном байте AR дескриптора.
Формат байта AR дескриптора
сегмента
Номер бита в Символическое
Назначение и содержимое
байте AR обозначение
О А Бит доступа (Accessed) к сегменту. Устанавливается аппаратно при обращении к
сегменту
1
R
Для сегментов кода — это бит доступа по чтению (Readable); определяет, возможно ли чтение из сегмента кода при
осуществлении замены префикса сегмента:
О
— чтение из сегмента запрещено;
1
— чтение из сегмента разрешено
W Для сегментов данных — это бит
записи:
О
— модификация данных в сегменте запрещена;
1
— модификация данных в сегменте разрешена
2 С Для сегментов кода — это бит
подчинения (Conforming):
1
— подчиненный сегмент кода;
О
— обычный сегмент кода;
ED Для многозадачного
режима определяет особенности смены значения текущего
уровня привилегий. Для сегментов данных — это бит
расширения вниз (Expand
Down); служит для различения сегментов стека и данных, а
также определяет
трактовку поля limit:
О
— сегмент данных;
1
— сегмент стека
3 I Бит предназначения (Intending):
О
— сегмент данных или стека;
1
— сегмент кода
4 S Если S-1 — то это бит сегмента (Segment). Для любых сегментов в памяти равен 1. Назначение и
порядок использования сегмента уточняется битами С и R;
если = 0 — то это бит системный (System). Такое состояние бита S говорит о том, что данный
дескриптор описывает специальный системный объект, который может и не быть
сегментом в памяти
5...6 dpl Поле уровня привилегий
сегмента
(Descriptor Privilege Level).
Содержит численное значение в диапазоне от О до 3
привилегированности
сегмента
7 Р Бит присутствия (Present):
О — сегмента нет в оперативной памяти в данный момент;
1 — сегмент находится в оперативной памяти в данный
момент
Наиболее важные поля байта AR — это
1) dpl (2 бита)
2) биты R/W, C/ED и I, которые вместе определяют тип сегмента.
Поле dpl — часть механизма защиты по привилегиям. Содержит значение 0.. 3 привилегированности сегмента.
Тип сегмента определяется тремя битами. Это поле определяет целевое назначение сегмента.
Рассмотрим назначение некоторых комбинаций этих битов.
Комбинации битов Назначение сегмента
000 Сегмент данных, только для чтения
001 Сегмент данных с разрешением чтения и
записи
010 Не определена
011 Сегмент стека с разрешением чтения и
записи
100 Сегмент кода с разрешением только
выполнения
101 Сегмент кода с разрешением выполнения и
чтения из него
110 Подчиненный сегмент кода с разрешением
выполнения
111 Подчиненный
сегмент кода с разрешением выполнения и чтения из него
Замечание. Возможны два принципиально разных вида сегментов: данных и кода. Сегмент стека является разновидностью сегмента данных, но с особой трактовкой поля размера сегмента. Это объясняется спецификой использования стека (он растет в направлении младших адресов памяти). Таким образом, видно, что поле типа ограничивает использование объявленных сегментов. В частности, программные сегменты не могут быть модифицированы без применения специальных приемов. Доступ к сегменту данных также может быть ограничен только на чтение.
Поддержка страничной модели памяти
Вспомним, при страничной организации ОП делится на блоки (страницы) фиксированного размера 4 Кб (число, кратное степени двойки, Þ операции сложения можно заменить на операции конкатенации).
Диспетчер памяти для каждой страницы формирует соответствующий дескриптор. Дескрипторы страниц собираются в таблицы.
Таблицы страниц
Есть два типа таблиц страниц:
1. Таблица каталогов таблиц страниц (PDE - page directiry entry)
2. Таблица страниц (PTE - page table entry)
Каждая таблица
состоит из 1024 (2**10) элементов. Элементами таблиц являются дескрипторы
страниц. Размер одного дескриптора - 4б. Þ Þ
для хранения одной таблицы необходима одна страница памяти.
|
Говорят, что осуществляется двухшаговая страничная трансляция адресов.
Рассмотрим
составляющие этого механизма.
Для текущей задачи создается одна таблица PDE и одна или более страниц PTE.
Все страницы текущей задачи описаны в таблицах страниц PTE - page table entry.
Одна таблица PTE состоит из 1024 (2**10) элементов - дескрипторов страниц Þ одна таблица страниц описывает пространство памяти в 4 Мб.
Если задаче недостаточно памяти в 4 МБ, создается несколько таблиц PTE.
Пусть текущая задача
использует 50 Мб памяти (например, графический редактор) Þ для описания этой памяти
надо иметь 14 таблиц PTE.
Для таблиц PTE текущей задачи создается
таблица PDE. В ней
каждый дескриптор указывает местонахождение одной таблицы PTE. Таблица PDE также состоит из 1024 (2**10)
элементов. (Остальные дескрипторы не используются.)
Обратим внимание, что для описания 50 Мб
памяти одной задачи требуется 15 страниц = 60Кб памяти (такие потери считаются
приемлемыми).
Формат дескриптора страницы
Каждая страница описывается дескриптором (32 бита).
Старшие 20 битов - номер страницы. По существу, это адрес страницы, т.к. приписывание в качестве младших разрядов 12 нулей приводит к получению начального адреса страницы;
! |
Количество битов, отводимое под номер страницы, определяет объем возможной ОП, которой может пользоваться программа.
· старшие 10 битов определяют номер (индекс) таблицы страниц PTE в таблице PDE
· младшие 10 битов - номер (индекс) дескриптора страницы в таблице PTE (а из этого дескриптора уже выбирается номер физической страницы).
Остальные биты
· (0): present - самый младший (нулевой) бит - так наз. бит присутствия. If present=0, то страница отсутствует в ОП Þ прерывание с передачей управления специальной программе, которая должна загрузить отсутствующую страницу;
· (1): read/write - для защиты памяти
· (2): User/supervisor - для защиты памяти
· (3,4) - нулевые
· (5): access - бит обращения, показывает, что к странице осуществлялся доступ
· (6): dirty - «грязный» бит - отмечает, что данную страницу модифицировали и при замещении ее следующей необходимо сохранить во внешней памяти
· (7,8) - нулевые
· (9,10,11) - зарезервированы для разработки системными программистами подсистемы организации виртуальной памяти
Переход микропроцессора в защищенный режим
Вспомним кратко процесс загрузки ОС и подчеркнем момент перехода в защищенный режим.
Сразу после включения питания или нажатия кнопки сброса микропроцессор начинает свою работу в реальном режиме. В этом режиме он производит действия по тестированию аппаратуры компьютера. После успешного завершения тестирования микропроцессор выполняет начальную загрузку системы, используя программу начальной загрузки, хранящейся на нулевой дорожке диска. Программа начальной загрузки считывает с диска программу инициализации операционной системы и передает ей управление. Действие этой программы зависит от того, в каком режиме работы микропроцессора будет осуществляться дальнейшее функционирование системы. Если в реальном режиме, то операционная система формирует среду и структуры данных для работы в этом режиме. Если же загружаемая операционная система собирается дальше работать в защищенном режиме, то она должна в него специальным образом перейти.
Но прежде чем сделать это, операционная система формирует системные структуры данных (в частности, рассмотренные нами дескрипторные таблицы) для работы в защищенном режиме. Затем может быть осуществлен переход в защищенный режим и выполнение дальнейших действий.