Для обеспечения надежной работы многозадачных операционных систем необходимо защищать задачи друг от друга. Защита предназначена для предотвращения несанкционированного доступа к памяти и выполнения критических (опасных для системы) инструкций – команды HLT, которая останавливает процессор, команд ввода/вывода, управления флагом разрешения прерываний и команд, влияющих на сегменты кода и данных. Механизмы защиты вводят следующие ограничения:
- ограничение использования сегментов (например, запрет записи в только читаемые сегменты данных или попытка исполнения данных, как кода); для использования доступны только сегменты, дескрипторы которых описаны в GDT и LDT,
- ограничение доступа к сегментам через правила привилегий,
- ограничение набора выполняемых инструкций – выделение привилегированных инструкций или операций, которые можно выполнять только при определенных уровнях CPL и IOPL,
- ограничение возможности межсегментных вызовов и передачи управления.
В защищенном режиме при выполнении команд процессор выполняет проверку условий, порождающих исключения.
|
|
Проверка при загрузке сегментных регистров:
- превышение лимита таблицы дескрипторов – #GP,
- несуществующий дескриптор сегмента – #NP или #SS,
- нарушение привилегий – #GP,
- загрузка неверного дескриптора или типа сегмента – #GP:
o загрузка в SS сегмента кода или сегмента данных только для чтения,
o загрузка управляющих дескрипторов в DS, ES или SS,
o загрузка только исполняемых сегментов в DS, ES или SS,
o загрузка сегмента данных в 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).
6 Лекция № 5. Переключение задач
Продолжительность: 2 часа (90 мин.)