Назад

Лекция №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) - зарезервированы для разработки системными программистами подсистемы организации виртуальной памяти

 

Переход микропроцессора в защи­щенный режим

 

Вспомним кратко процесс загрузки ОС и подчеркнем момент перехода в защищенный режим.

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

Но прежде чем сделать это, операционная система формиру­ет системные структуры данных (в частности, рассмотренные нами дескрипторные таблицы) для работы в защищенном режиме. Затем может быть осуществлен переход в защищенный режим и выполнение дальнейших действий.

Назад