10.7. Механизм защиты

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

Когда процессор находится в защищенном режиме, проверки привилегий выпол­няются всегда и их нельзя отключить, но можно использовать во всех дескрипторах и селекторах один и тот же максимальный уровень привилегий - нулевой, и созда­стся видимость отсутствия защиты. Именно так мы поступали в вышеописанных примерах - поля DPLh RPL инициализировались нулями. Для осуществления не­заметной проверки прав на уровне страничной адресации надо установить биты U и Wbo всех элементахтаблиц страниц, что мы также выполняли в nporpaMMepm3.asm.

За механизм защиты отвечают следующие биты и поля:

□ в дескрипторах сегментов:

- бит S (системный сегмент);

- поле типа (тип сегмента, включая запреты на чтение/запись);

- поле лимита сегмента;

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

□ в селекторах сегментов:

- поле RPL, определяющее запрашиваемые привилегии, позволяет програм­мам, выполняющимся на высоких уровнях привилегий, обращаться к сег­ментам, как будто их уровень привилегий ниже;

- поле RPL селектора, загруженного в CS, называется CPL и является теку­щим уровнем привилегий программы;

□ в элементах таблиц страниц:

- бит U (определяет уровень привилегий страницы);

- бит W (разрешает/запрещает запись).

Уровни привилегий в процессорах Intel:

□ 0 - максимальный (для операционной системы);

а 1 и 2 - промежуточные (для вспомогательных программ);

□ 3 - минимальный (для пользовательских приложений).

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