Глава 11. Шлюз задачи.
Одним из основных условий, обеспечивающих защиту в защищённом режиме, является изоляция программ на разных уровнях привилегий. Программа, работающая на уровне привилегий 3 (это менее привилегированный уровень), может обращаться к сегментам данных, кода и системным объектам, находящихся только на том же уровне привилегий. Тоже самое касается программ, работающих на уровнях 2 и 1 и только программам на нулевом уровне привилегий (самым привилегированным или, иначе говоря, системным программам) можно обращаться к любым сегментам и объектам, за одним исключением - для любого уровня привилегий передача управления может производитьсятолько на том же уровне привилегий. Уровень привилегий задаётся в двухбитовом поле DPL дескриптора сегмента или системного объекта; теоретическое назначение и практическое использование уровней привилегий подробно обсуждается в разделе "Защита".
В общем виде, операционная система использует несколько уровней привилегий. Когда происходит прерывание или исключение, процессор обращается к дескрипторной таблице прерываний IDT, выбирает из неё соответствующий дескриптор и передаёт управление обработчику прерываний или исключения. Таблица прерываний в системе одна, обработчики находятся на 0-м уровне привилегий. Что будет, если прерывание или исключение произойдёт в программе, работающей на не нулевом уровне привилегий? Ведь процессор, по идее, не позволяет передачу управления между уровнями привилегий, а переключение через IDT на обработчик прерывания как раз и является передачей управления из одной программы (процедуры) в другую, причём, они могут находится на разных уровнях привилегий.
Итак, процессор не позволяет прямую межуровневую передачу управления и этим изолирует процедуры на разных уровнях привилегий. Однако, процессор позволяет передачу управления через посредника - специальный объект, так называемый шлюз. Функция шлюза сводится к тому, что запрос на передачу управления от менее привилегированной процедуры может "опуститься" на более привилегированный уровень, а после того, как запрошенная процедура отработает, управление возвратится начальной процедуре, "поднявшись" на свой уровень привилегий через этот же шлюз.
Шлюзы специально предусмотрены для межуровневой передачи управления; подразумевается, что созданием шлюзов должна заниматься только операционная система. Именно из шлюзов состоит дескрипторная таблица прерываний, в ней разрешено применять три типа таких объектов - шлюзы прерывания, ловушки и задачи. Первые два подробно рассматриваются в разделе "Прерывания в защищённом режиме", в этой главе мы рассмотрим шлюз задачи.
Шлюз задачи позволяет установить в качестве обработчика вектора прерывания отдельную задачу. Формат шлюза задачи следующий:
dw 0 ; Зарезервировано dw TSS_sel ; Селектор дескриптора TSS задачи обработчика. db 0 ; Зарезервировано db access_rights ; Права доступа dw 0 ; Зарезервировано
Как видите, вся информация хранится в двух полях:
Селектор TSS - указывает на дескриптор TSS задачи, на которую произойдёт переключение, если передача управления будет происходить через этот шлюз.
| Права доступа:
|
|
Реализуя мультизадачную систему, следует позаботиться о том, чтобы все используемые вектора прерываний обрабатывались отдельными задачами. Вообще говоря, можно не определять эти задачи и тогда обработка прерываний и исключений будет происходить в контексте текущей задачи (например, так это было в двух предыдущих примерах). И всё же, реализация всех обработчиков или наиболее важных из них отдельными задачами значительно повышает устойчивость системы к сбоям, происходящим как по вине ошибок в самой системе, так и умышленных попыток нарушить целостность ОС.
Каждая задача обработчика имеет свой контекст, в котором определены все сегменты, используемые им в работе, в том числе, такие критические, как код и стек. Контекст задачи позволяет полностью изолировать обработчик прерывания от всех остальных программ и это послужит гарантией надёжности его работы.
Следующая глава | Оглавление | Вопросы? Замечания? Пишите: sasm@narod.ru |
Copyright © Александр Семенко. |