11/04/94 09:56am
zr_zash.lek
А.В.Фролов, Г.В.Фролов "Защищенный
режим процессоров Intel 80286/80386/80486.
Практическое руководство по
использованию защищенного
режима" БСП том 6 М
"Диалог-МИФИ" 1993
В.Б.Бродин, И.И.Шагурин
"Микропоцессор i486. Архитектура,
программирование, интерфейс" М
"Диалог-МИФИ" 1993
Защита программ и данных в процессоре i286.
Взаимная защита программ и данных в MS DOS основана на "джентельменском" соглашении о неиспользовании чужих областей. Но проблема заключается в том, что соглашение может быть нарушенно непреднамеренно всвязи с ошибкой в программе или из-за того что ОС не всегда может учесть требования всех загруженных потребителей адресного пространства.
Для организации защиты информации необходимо обеспечить:
Запретить пользовательским программам обращаться к областям, содержащим системную информацию (таблици устройств, системные переменные);
Закрыть доступ пользовательских программ к памяти и устройствам, распределенным для других программых модулей (пользовательских и ОС);
Исключить влияние программ друг на друга через систему комманд и исполняющую систему (зависание или программный останов одной задачи не должен влиять на ход выполнения другой);
Определить привила и очередность доступа к общим ресусам (устройству печати, дисплею и дискам).
Для решения этих задач используется:
1 Схема "супервизор-пользователь":
ОС работает в привелигированном режиме "супервизор". Ей доступна вся оперативная память и все внешние устройства;
Все остальные программы работают в "пользовательском" режиме и им доступен ограниченный размер ОП (ограничение может быть аппаратным, например принудительной установкой старших битов адреса в определенное значение). Для выполнения операций ввода/вывода пользовательские программы обращаются к супервизору, имеющему систему буферов обмена с физическими устройствами;
2 Система ключей:
Каждая выполняемая программа имеет числовой идентификатор - "ключ";
Каждая выделенная область памяти имеет аналогичный идентификатор;
При обрашении ключи программы и памяти сравниваются и делается вывод о возможности доступа;
3 Система привелигированных и чувствительных команд;
Все команды делятся на три группы по возможности разрушения системы;
Привелигированные команды могут выполняться только программами, образующими ОС. Попытка выполнить такую команду в пользовательской программе приводит к ее игнорированию или обращению к ОС через "отказ";
Чувствительные команды меняют свой алгоритм в зависимости от статуса выполняемой программы (могут не выполняться отдельные варианты команд или не выбираться отдельные операнды);
Нечувствительные команды, их выполнение не зависит от внешних причин.
ПРИМЕЧАНИЕ: В реальных системах используются комбинации описанных схем защиты.
Кольца защиты.
Процессор i286 имеет четырехуровневую систему привилегий, и связанную с ней
систему защиты, называемую КОЛЬЦАМИ ЗАЩИТЫ.
Когда программа загружается в память ей присваивается текущий уровень привилегий CPL (Current Privilege Level). Это значение записывается в поля DPL записей, образующих ее таблицу дескрипторов и в поле RPL регистра сегмента кода CS. Программа может проанализировать предоставленный уровень привилегий, но не может его изменить. Однако возможно изменение полей RPL сегментных регистров данных.
Правила доступа к сегментам программ и данных:
Данные из сегмента, имеющего уровень защиты PL, могут быть выбраны программой, имеющей такой же или более высокий уровень привилегий;
При выборке данных вычисляется ЭФФЕКТИВНЫЙ уровень привилегий определяемый как максимальное значение (что соответствует наименьшему уровню привилегий) CPL (из регистра CS) и RPL (из используемого сегментного регистра).
Сегмент программы (процедура), имеющий уровень защиты PL, может быть вызван программой, имеющий такой же или более низкий уровень привилегий, если используется "согласованный" сегмент. Такая процедура будет выполняться с уровнем привилегий вызвавшей ее программы!
Сегмент программы (процедура), имеющего уровень защиты PL, может быть вызван программой имеющей такой же или более высокий уровень привилегий вне зависимости от согласованности сегмента.
ПРИМЕЧАНИЕ: Нарушение правил доступа вызывает прерывание "нарушение общей защиты памяти" (Dh). Не следует забывать о возможности отсутствия сегмента в памяти.
Привелигированные и чувствительные команды.
Сушествуют команды, выполнение которых возможно только в нулевом приоритетном кольце:
LGDT - Загрузка регистра глобальной таблицы дескрипторов;
LLDT - Загрузка регистра локальной таблицы дескрипторов;
LIDR - Загрузка регистра таблицы дескрипторов прерываний;
LTR - Загрузка регистра задачи TR (загружает селектор, определяющий дескриптор GDT, ссылающийся на TSS выполняемой задачи);
LMSW - Загрузка слова состояния машины MSW (используется для перехода в защищенный режим);
CLTS - Сброс флага переключения задачи (флаг устанавливается при каждом переключении задачи);
HLT - Останов процессора.
Команды ввода/вывода также являются привелигированными, но кольцо из которого можно к ним обратиться не фиксированно. Значение наименее привелигированного кольца в котором они доступны указано в поле IOPL регистра флагов микропроцессора FLAGS (биты 12-13). Это поле не модифицируется при загрузке регистра флагов не в нулевом кольце.
Межсегментная передача управления.
При передаче управления командами CALL и JMP необходимо изменить значение сегментного регистра CS (передача межсегментная!). Если правила доступа не нарушаются (см. выше), то передача управления эквивалентна передаче в реальном режиме. При нарушении правил (несогласованность более привилегированного сегмента) передача "напрямую" не возможна. В этом случае управление передается через шлюз (вентиль) вызова. Шлюз гарантирует, что передача управления будет осуществлена именно в точку входа, а не в произвольное место. Значение сегмента в команде игнорируется; используется полько селектор.
Структура дескриптора типа "шлюз вызова":
СМЕЩЕНИЕ (16 бит) - смешение точки входа от сегмента памяти;
СЕЛЕКТОР (16 бит) - значение селектора для вызова;
СЧЕТЧИК СЛОВ (8 бит) - количество 16-ти битовых слов (для i386+ слова 32-х битовые), подлежащих передаче в вызываемый модуль. ВНИМАНИЕ: используются только пять младших битов этого поля, старшие три бита должны быть равны нулю;
ДОСТУП (8 бит) - поле доступа должно соответствовать шлюзу вызова, а его поле DPL указывать минимальный уровень привилегий необходимых для прохода через вентиль;
РЕЗЕРВ (16 бит).
При вызове указанное количество параметров копируется из стека вызывающей программы в стек вызываемой (который специально создается вновь). При возврате сохраненнная информация восстанавливается из стека вызывающей программы. Место для создатия стека определяется при помощи TSS вызывающей задачи.
Режим ВИРТУАЛЬНОЙ ПАМЯТИ в процессоре i286 реализован недостаточно эффективно, основтой недостаток - отсутствие аппаратной борьбы с фрагментацией памяти. Дефрагментация осуществляется перемещением информации с последующей перестройкой таблиц дескрипторов.