Защита.

Глава 3. Межсегментная и межуровневая передача управления.

        Для передачи управления из одного сегмента кода в другой, селектор целевого сегмента должен быть загружен в регистр CS. При загрузке процессор проверит в дескрипторе этого сегмента его предел, тип и уровень привилегий. Если проверка была успешной, то селектор будет загружен и произойдёт передача управления.
        Передача управления осуществляется командами JMP, CALL, RET, SYSENTER, SYSEXIT, INT n и IRET.
        Команда JMP или CALL может ссылаться на другой сегмент любым из 4-х способов:
  • Операнд команды содержит селектор целевого сегмента.
  • Операнд указывает на дескриптор шлюза вызова, который содержит селектор целевого сегмента.
  • Операнд указывает на TSS, в котором содержится целевой сегмент кода.
  • Операнд указывает на шлюз задачи, который указывает на TSS, в котором содержится целевой сегмент кода.

            Команды SYSENTER и SYSEXIT предназначены для быстрого вызова и возврата системных процедур; их действия описаны в главе 5.
            Близкие формы команд JMP, CALL и RET передают управление внутри текущего сегмента кода и проверка уровня привилегий не производится. Дальние формы этих команд передают управление в другой сегмент и при этом происходит проверка уровня привилегий.
            При передаче управления в другой сегмент кода без перехода через шлюз вызова, процессор проверяет 4 типа уровней привилегий и тип сегмента:
  • CPL сегмента кода, из которого происходит передача управления.
  • DPL дескриптора сегмента кода, в который происходит передача управления.
  • RPL селектора целевого сегмента.
  • Флаг подчинения C в дескрипторе целевого сегмента кода ( C=1/0 - сегмент подчинённый / неподчинённый).

            Правила, по которым процессор проверяет CPL, RPL и DPL зависят от значения флага C.

    Доступ к неподчинённому сегменту кода.

            При доступе к неподчинённому сегменту кода, CPL вызывающей процедуры должен быть равен DPL целевого сегмента кода, иначе процессор сгенерирует исключение общей защиты.
            RPL селектора неподчинённого сегмента кода должен быть численно не больше CPL текущего кода. Когда такой селектор загружается в CS, поле привилегий CPL не меняется, даже если RPL имеет другое значение.

    Доступ к подчинённому сегменту кода.

            При доступе к подчинённому сегменту кода, CPL вызывающей процедуры должен быть численно не меньше DPL целевого сегмента, иначе процессор генерирует исключение общей защиты. Для подчинённого сегмента поле RPL селектора не учитывается.
            Для подчинённого сегмента кода DPL показывает численно наименьший уровень привилегий, которая может иметь вызывающая процедура для доступа в него.
            При передаче управления подчинённому сегменту кода, CPL не меняется, даже если DPL целевого сегмента меньше, чем CPL. Эта ситуация - единственная, когда CPL отличается от DPL. Кроме того, т.к. CPL не меняется, то не происходит смены стека.
            Подчинённые сегменты используются для таких модулей, как математические библиотеки и обработчики исключений, которые поддерживают приложения, но не требуют доступа к защищённым ресурсам системы. Эти модули являются частью ОС, но они могут выполняться на численно большем уровне привилегий (т.е. менее привилегированном). То, что CPL не меняется при переходе на подчинённый сегмент, ограничивает прикладную программу от доступа к более привилегированным ресурсам (коду и данным).
            Большая часть сегментов кода - не подчинённые и в них передавать управление можно только на их уровне привилегий, кроме случаев перехода через шлюзы вызова, описанного в следующей главе.

    Следующая глава Оглавление Вопросы? Замечания? Пишите: sasm@narod.ru

      Copyright © Александр Семенко.
    TopList

    Hosted by uCoz