Мультизадачность.

Глава 11. Шлюз задачи.

        Одним из основных условий, обеспечивающих защиту в защищённом режиме, является изоляция программ на разных уровнях привилегий. Программа, работающая на уровне привилегий 3 (это менее привилегированный уровень), может обращаться к сегментам данных, кода и системным объектам, находящихся только на том же уровне привилегий. Тоже самое касается программ, работающих на уровнях 2 и 1 и только программам на нулевом уровне привилегий (самым привилегированным или, иначе говоря, системным программам) можно обращаться к любым сегментам и объектам, за одним исключением - для любого уровня привилегий передача управления может производитьсятолько на том же уровне привилегий. Уровень привилегий задаётся в двухбитовом поле DPL дескриптора сегмента или системного объекта; теоретическое назначение и практическое использование уровней привилегий подробно обсуждается в разделе "Защита".
        В общем виде, операционная система использует несколько уровней привилегий. Когда происходит прерывание или исключение, процессор обращается к дескрипторной таблице прерываний IDT, выбирает из неё соответствующий дескриптор и передаёт управление обработчику прерываний или исключения. Таблица прерываний в системе одна, обработчики находятся на 0-м уровне привилегий. Что будет, если прерывание или исключение произойдёт в программе, работающей на не нулевом уровне привилегий? Ведь процессор, по идее, не позволяет передачу управления между уровнями привилегий, а переключение через IDT на обработчик прерывания как раз и является передачей управления из одной программы (процедуры) в другую, причём, они могут находится на разных уровнях привилегий.
        Итак, процессор не позволяет прямую межуровневую передачу управления и этим изолирует процедуры на разных уровнях привилегий. Однако, процессор позволяет передачу управления через посредника - специальный объект, так называемый шлюз. Функция шлюза сводится к тому, что запрос на передачу управления от менее привилегированной процедуры может "опуститься" на более привилегированный уровень, а после того, как запрошенная процедура отработает, управление возвратится начальной процедуре, "поднявшись" на свой уровень привилегий через этот же шлюз.
        Шлюзы специально предусмотрены для межуровневой передачи управления; подразумевается, что созданием шлюзов должна заниматься только операционная система. Именно из шлюзов состоит дескрипторная таблица прерываний, в ней разрешено применять три типа таких объектов - шлюзы прерывания, ловушки и задачи. Первые два подробно рассматриваются в разделе "Прерывания в защищённом режиме", в этой главе мы рассмотрим шлюз задачи.
        Шлюз задачи позволяет установить в качестве обработчика вектора прерывания отдельную задачу. Формат шлюза задачи следующий:

dw	0			; Зарезервировано
dw	TSS_sel		; Селектор дескриптора TSS задачи обработчика.
db	0			; Зарезервировано
db	access_rights	; Права доступа
dw	0			; Зарезервировано


Рисунок 11-1. Схема шлюза задачи.

        Как видите, вся информация хранится в двух полях:
  •  
  • Селектор TSS - указывает на дескриптор TSS задачи, на которую произойдёт переключение, если передача управления будет происходить через этот шлюз.
  •  
  • Права доступа:
  •  
  • флаг P (присутствие шлюза) определяет наличие шлюза в памяти. Как, правило этот флаг всегда установлен.
  •  
  • поле DPL определяет численно наибольший уровень привилегий, который должна иметь процедура, обращающаяся к обработчику прерывания через команды INT n, INT 3 и INTO. Если обращение к шлюзу задачи вызвано исключением или аппаратным прерыванием, то это поле DPL игнорируется.

            Реализуя мультизадачную систему, следует позаботиться о том, чтобы все используемые вектора прерываний обрабатывались отдельными задачами. Вообще говоря, можно не определять эти задачи и тогда обработка прерываний и исключений будет происходить в контексте текущей задачи (например, так это было в двух предыдущих примерах). И всё же, реализация всех обработчиков или наиболее важных из них отдельными задачами значительно повышает устойчивость системы к сбоям, происходящим как по вине ошибок в самой системе, так и умышленных попыток нарушить целостность ОС.
            Каждая задача обработчика имеет свой контекст, в котором определены все сегменты, используемые им в работе, в том числе, такие критические, как код и стек. Контекст задачи позволяет полностью изолировать обработчик прерывания от всех остальных программ и это послужит гарантией надёжности его работы.

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

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

    Hosted by uCoz