- •1 Общие положения
- •1.1 Цели и задачи курса
- •3 Лекция № 2. Структуры данных защищенного режима
- •3.1 Ключевые вопросы
- •3.2 Текст лекции
- •4 Лекция № 3. Привилегии
- •4.1 Ключевые вопросы
- •4.2 Текст лекции
- •5.1 Ключевые вопросы
- •5.2 Текст лекции
- •5 Лекция № 4. Защита
- •6 Лекция № 5. Переключение задач
- •6.1 Ключевые вопросы
- •6.2 Текст лекции
- •7 Лекция № 6. Страничное преобразование
- •7.1 Ключевые вопросы
- •7.2 Текст лекции
- •8 Лекция № 7. Структура Windows 2000
- •8.1 Ключевые вопросы
- •8.2 Текст лекции
- •9 Лекция № 8. Основные компоненты системы
- •9.1 Ключевые вопросы
- •9.2 Текст лекции
- •10 Лекция № 9. Подсистемы окружения и исполнительная система
- •10.1 Ключевые вопросы
- •10.2 Текст лекции
- •11 Лекция № 10. Ядро и подсистема ввода-вывода
- •11.1 Ключевые вопросы
- •11.2 Текст лекции
5 Лекция № 4. Защита
Продолжительность: 2 часа (90 мин.)
5.1 Ключевые вопросы
Цель и способы защиты.
Правило привилегий при передаче управления.
Правила доступа к сегментам.
Изменение уровня привилегий.
Передача управления с изменением уровня привилегий.
Защита данных и кодов программ.
Использование шлюзов.
5.2 Текст лекции
Для обеспечения надежной работы многозадачных операционных систем необходимо защищать задачи друг от друга. Защита предназначена для предотвращения несанкционированного доступа к памяти и выполнения критических (опасных для системы) инструкций – команды HLT, которая останавливает процессор, команд ввода/вывода, управления флагом разрешения прерываний и команд, влияющих на сегменты кода и данных. Механизмы защиты вводят следующие ограничения:
ограничение использования сегментов (например, запрет записи в только читаемые сегменты данных или попытка исполнения данных, как кода); для использования доступны только сегменты, дескрипторы которых описаны в GDT и LDT,
ограничение доступа к сегментам через правила привилегий,
ограничение набора выполняемых инструкций – выделение привилегированных инструкций или операций, которые можно выполнять только при определенных уровнях CPL и IOPL,
ограничение возможности межсегментных вызовов и передачи управления.
В защищенном режиме при выполнении команд процессор выполняет проверку условий, порождающих исключения.
Проверка при загрузке сегментных регистров:
превышение лимита таблицы дескрипторов – #GP,
несуществующий дескриптор сегмента – #NP или #SS,
нарушение привилегий – #GP,
загрузка неверного дескриптора или типа сегмента – #GP:
загрузка в SS сегмента кода или сегмента данных только для чтения,
загрузка управляющих дескрипторов в DS, ES или SS,
загрузка только исполняемых сегментов в DS, ES или SS,
загрузка сегмента данных в CS.
Проверка ссылок операндов:
запись в сегмент кода или в сегмент данных только для чтения – #GP,
чтение из только исполняемого сегмента кодов – #GP,
превышение лимита сегмента – #SS или #GP.
Проверка привилегий инструкций:
CPL 0 при выполнении команд LIDT, LLDT, LGDT, LTR, LMSW, CTS, HLT, INVD, INVLPG, WBINVD, операции с регистрами DRn, TRn, CRn – #GP,
CPL > IOPL при выполнении команд STI, CLI,
CPL > IOPL при выполнении инструкций IN, INS, OUT, OUTS с портами, не разрешенными битовой картой ввода/вывода – #GP.
При выполнении команд IRET и POPF c недостаточным уровнем привилегий биты IF и IOPL в регистре флагов не изменяются, исключения не генерируются:
IF не меняется при CPL > IOPL,
IOPL не меняется, если CPL >0.
Проверка при передаче управления по инструкциям JMP, CALL, RET, INT IRET включают, как проверку ссылок по лимиту (в ближних формах JMP, CALL, RET выполняются только эти проверки), так и проверку правил привилегий при межсегментных передачах через вентили.
Для того, чтобы задачи не вызывали срабатывания защиты, в систему команд введены специальные инструкции тестирования указателей. Они позволяют быстро удостовериться в возможности использования селектора или сегмента без риска порождения исключения:
ARPL – выравнивание RPL. При ее исполнении RPL селектора приравнивается максимальному значению из текущего RPL селектора и поля RPL в указанном регистре. Если при этом RPL изменился, устанавливается флаг нуля ZF = 1,
VERR – проверка возможности чтения: если сегмент, на который указывает селектор, допускает чтение, устанавливается ZF = 1,
VERW – проверка возможности записи: если сегмент, на который указывает селектор, допускает запись, устанавливается ZF = 1,
LSL – чтение лимита сегмента в регистр, если позволяют привилегии; при успешном выполнении устанавливается ZF = 1,
LAR – чтение байта доступа дескриптора в регистр, если позволяют привилегии; при успешном выполнении устанавливается ZF = 1.
Некоторые функции защиты выполняются и механизмом страничной переадресации, однако, в отличие от сегментной защиты, которая может быть обойдена только на нулевом уровне привилегий, страничную защиту можно обойти на уровне пользователя (CPL= 3).
