Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Организация ввода-вывода. Лекции.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
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).