|
[Назад] [Далее] | |
Теперь рассмотрим механизм, который дал название режиму процессора, — механизм защиты. Защита может действовать как на уровне сегментов, так и на уровне страниц, ограничивая доступ в зависимости от уровня привилегий (4 уровня привилегий для сегментов и два для страниц). Защита предотвращает возможность для программ вносить изменения в области памяти, занятые операционной системой или более привилегированной программой. Процессор проверяет привилегии непосредственно перед каждым обращением к памяти и, если происходит нарушение защиты, вызывает исключение #GP.
Если процессор находится в защищенном режиме, проверки привилегий выполняются всегда и их нельзя отключить, но можно использовать во всех дескрипторах и селекторах один и тот же максимальный уровень привилегий — нулевой, и создастся видимость отсутствия защиты. Именно так мы и поступали во всех примерах до сих пор — все поля DPL и RPL инициализировались нулями. Чтобы сделать незаметной проверку прав на уровне страничной адресации, надо установить биты U и W во всех элементах таблиц страниц, что мы также делали в программе pm3.asm.
За механизм защиты отвечают следующие биты и поля:
в дескрипторах сегментов:
бит S (системный сегмент)
поле типа (тип сегмента, включая запреты на чтение/запись)
поле лимита сегмента
поле DPL, определяющее привилегии сегмента или шлюза, указывает, по крайней мере, какой уровень привилегий должна иметь программа, чтобы обратиться к этому сегменту или шлюзу
в селекторах сегментов:
поле RPL, определяющее запрашиваемые привилегии, позволяет программам, выполняющимся на высоких уровнях привилегий, обращаться к сегментам, как будто их уровень привилегий ниже
поле RPL селектора, загруженного в CS, называется CPL и является текущим уровнем привилегий программы
в элементах таблиц страниц:
бит U (определяет уровень привилегий страницы)
бит W (разрешает/запрещает запись)
Уровни привилегий в процессорах Intel определены как:
0 — максимальный (для операционной системы);
1 и 2 — промежуточные (для вспомогательных программ);
3 — минимальный (для пользовательских приложений).
Перед обращением к памяти процессор выполняет несколько типов проверок, использующих все указанные флаги и поля. Рассмотрим их по порядку.