Адресация и многозадачность: Механизм защиты

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Во всех процессорах, начиная с Intel286, при установке CR0.PE = 1 включается защищенный режим работы. В этом режиме помимо средств расширенной адресации и поддержки мультизадачности процессор обеспечивает многоуровневую систему защиты. Защита предотвращает несанкционированное использование данных, исполняемых кодов и портов ввода/вывода. Таким образом обеспечивается устойчивая и безопасная работа всех программ в многозадачной среде.

В функции механизма защиты входят следующие действия, выполняемые всякий раз при обращении к данным или программам:

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

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

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

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

Защита на уровне сегментов

Защита на уровне сегментов является основной и обеспечивает наибольшее количество функций. Основа ее функционирования — это разделение уровней привилегий и отслеживание текущих прав доступа.

Система защиты на уровне сегментов поддерживает четыре уровня привилегий (0, 1, 2, 3). Самым привилегированным уровнем считается нулевой уровень привилегий. На этом уровне предполагается исполнение программ ядра мультизадачных операционных систем (в простых ОС все программы, в т.ч. и пользовательские, могут исполняться на нулевом уровне привилегий, что равнозначно отсутствию защиты по уровням привилегий). Следующие уровни привилегий (1, 2, 3) предназначены для вспомогательных и пользовательских программ. Специальные дескрипторы — т.н. шлюзы, обеспечивают взаимодействие между задачами, выполняемыми на различных уровнях привилегий. Обычно все пользовательские программы работают на уровне привилегий 3, т.е. обладают наименьшим количеством прав доступа к различным компонентам ОС и областям памяти.

Для слежения за текущим уровнем привилегий (Current Privilege Level – CPL) и разграничения прав доступа предназначены поля DPL в дескрипторах сегментов и RPL в селекторах сегментов. Текущий уровень привилегий CPL соответствует уровню привилегий текущего сегмента кода и может быть считан из его селектора в регистре CS. Каждый раз при обращении к командам и данным процессор, опираясь на значение CPL, проводит проверку допустимости того или иного действия. В случае несоответствия запрошенного действия правам выполняемой программы, процессор генерирует специальное прерывание #GP (ошибка общей защиты), и далее разрешение возникшей проблемы ложится на обработчик этого прерывания (который, должен функционировать на самом привилегированном уровне).

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

Защита на уровне страниц

Механизм страничной защиты введен в процессорах начиная с Intel386 и работает поверх всех средств сегментной защиты. Он включается в работу при инициализации страничного механизма и обеспечивает:

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

Его работа основана на специальных полях U/S и W/R в элементах таблиц страничных преобразований.

Поле U/S определяет права доступа для соответствующей страницы (страниц):

  • U/S = 0 — Supervisor (Супервизор),
  • U/S = 1 — User (Пользователь).

Процессор защищает страницы супервизора от доступа к ним из программ с привилегиями пользователя. То есть происходит расширение механизма сегментной защиты на страничную схему. Программы с текущим уровнем привилегий CPL = 0, 1, 2 обладают правами супервизора, а программы с CPL = 3правами пользователя.

Поле W/R предназначено для установки защиты пользовательских страниц от записи. Причем в зависимости от текущего значения флага CR0.WP пользовательские страницы могут быть защищены и от записи программами супервизора, а не только от пользовательских программ.

Поля U/S и W/R имеются и в элементах каталога страниц и в элементах таблицы страниц. Поэтому возможно задание комбинированных условий защиты для различных страниц.

 

Таблица 2.6. Комбинация защиты в каталоге и в таблице страниц

Элемент каталога страниц

Элемент таблицы страниц

Итоговый эффект

Привилегия

Доступ

Привилегия

Доступ

Привилегия

Доступ

U

R

U

R

U

R

U

R

U

W

U

R

U

W

U

R

U

R

U

W

U

W

U

R/W

U

R

S

R

S

R/W*

U

R

S

W

S

R/W*

U

W

S

R

S

R/W*

U

W

S

W

S

R/W

S

R

U

R

S

R/W*

S

R

U

W

S

R/W*

S

W

U

R

S

R/W*

S

W

U

W

S

R/W

S

R

S

R

S

R/W*

S

R

S

W

S

R/W*

S

W

S

R

S

R/W*

 

Значения флагов:   U – пользователь (U/S = 1); S – супервизор (U/S = 0);

R – только чтение (R/W = 0); W– чтение/запись (R/W = 1)

* Если CR0.WP = 0, то страница защищена от записи и возможно только ее чтение (R).

 

 

Нарушение страничной защиты приводит к генерации страничной ошибки (#PF).

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