Assembler - язык неограниченных возможностей


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


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

Если процессор находится в защищенном режиме, проверки привилегий выполняются всегда и их нельзя отключить, но можно использовать во всех дескрипторах и селекторах один и тот же максимальный уровень привилегий — нулевой, и создастся видимость отсутствия защиты. Именно так мы и поступали во всех примерах до сих пор — все поля DPL и RPL инициализировались нулями. Чтобы сделать незаметной проверку прав на уровне страничной адресации, надо установить биты U и W во всех элементах таблиц страниц, что мы также делали в программе pm3.asm.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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





Начало  Назад  Вперед