Текст лекции. Для обеспечения надежной работы многозадачных операционных систем необходимо защищать задачи друг от друга

Для обеспечения надежной работы многозадачных операционных систем необходимо защищать задачи друг от друга. Защита предназначена для предотвращения несанкционированного доступа к памяти и выполнения критических (опасных для системы) инструкций – команды 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 мин.)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: