Если в памяти одновременно могут находиться несколько независимых прог-рамм, необходимы специальные меры по предотвращению или ограничению обращений одной программы к областям памяти, используемым другими программами, чтобы воспрепятствовать искажению информации, принадле-жащей другим программам. Последствия таких ошибок особенно опасны, если разрушению подвергнутся программы ОС. Другими словами, надо исключить несанкционированное воздействие программы пользователя на работу программ других пользователей и программ операционной системы.
►Чтобы воспрепятствовать разрушению одних программ другими, достаточно защитить область памяти данной программы от попыток записи в нее со стороны других программ, а в некоторых случаях и своей программы (защита от записи), при этом допускается обращение других программ к этой области памяти для считывания данных.
►В других случаях, например, при ограничениях на доступ к информации, хранящейся в системе, необходимо иметь возможность запрещать другим программам производить как запись, так и считывание в данной области памяти. Такая защита от записи и считывания помогает отладке программы, при этом осуществляется контроль каждого случая выхода за область памяти своей программы.
Средства защиты памяти должны предотвращать:
· неразрешенное взаимодействие пользователей друг с другом;
несанкционированный доступ пользователей к данным;
повреждение программ и данных из-за ошибок в программах;
намеренные попытки разрушить целостность системы;
· случайные искажения данных. ► Средства защиты МП: ◊ защита при управлении памятью и ◊ защита по привилегиям.
►Средства управления памятью обнаруживают программные ошибки.
До загрузки селектора в сегментный регистр и кэширования дескриптора осуществляется несколько контрольных проверок:
· МП проверяет, что поле Index селектора находится в пределах таблицы, определяемой битом TI;
· при загрузке селекторав сегментный регистр данных (DS, ES, FS, GS) тип дескриптора должен разрешать считывание из сегмента.
в случае сегментного регистра стека (SS) в сегменте должны быть разрешены операции считывания и записи;
при загрузке регистра CS сегмент обязательно должен быть исполняемым;
в регистр LDTR можно загружать только селектор, указывающий на дескриптор сегмента типа LDT;
в регистр TR можно загружать только селектор, указывающий на дескриптор сегмента состояния задачи.
Если хотя бы одна проверка дала отрицательный результат, то формируется особый случай и загрузка селектора не производится.
● После загрузки селектора при фактическом обращении к памяти процессор контролирует, чтобы запрашиваемая операция (чтение/запись) для этого сегмента была разрешена. На этом этапе обнаруживаются и отвергаются попытки записи в сегмент кода или в только считываемые сегменты данных, а также считывание из сегмента кода, для которого разрешено только выполнение. Здесь же проводится проверка превышения сформированного смещения в сегментедлины сегмента, указанной в поле предела дескриптора. Такие ситуации невозможно выявить при загрузке селектора.
►Защита по привилегиям фиксирует более тонкие ошибки и намеренные попытки нарушить целостность системы.
Под привилегиямипонимается свойство, определяющее, какие операции и обращения к памяти разрешается производить процессору при выполнении текущей задачи.
На аппаратном уровне в МП поддерживаются 4 уровня привилегий. Распознаваемым процессором объектам назначается значение от 0 до 3, причем 0 соответствует высшему, а 3 - низшему уровню привилегий.
С помощью указания уровня привилегий и правил защиты обеспечивается управляемый доступ к процедурам и данным ОС и других задач.
Привилегииустанавливаются значениями соответствующих полей в следующих основных системных объектах микропроцессора:
DPL - уровень привилегий сегмента (находится в байте доступа дескриптора сегмента);
RPL - биты <0,1> селектора, хранящегося в сегментном регистре; текущий уровень привилегий программы CPL задается полем RPL селектора, хранящегося в сегментном регистре CS;
IOPL - поле регистра флагов, которое указывает, на каком уровне привилегий разрешено выполнять операции ввода/вывода, а также в некоторых других объектах, используемых, например, при переключении задач и обработке прерываний.
Так как число программ, которые могут выполняться на более высоком уровне привилегий, уменьшается к уровню 0 и так как программы уровня 0 действуют как ядро системы, уровни привилегий обычно изображаются в виде четырех колец защиты(Protection Rings) (рис. 1).
Рис. 1. "Кольца защиты"
Типовое распределение программ по кольцам защиты выглядит следующим образом:
уровень 0: ядро ОС, обеспечивающее инициализацию работы, управление доступом к памяти, защиту и ряд других жизненно важных функций, нарушение которых полностью выводит из строя процессор;
уровень 1: основная часть программ ОС (утилиты);
уровень 2: служебные программы ОС (драйверы, СУБД, специализированные подсистемы программирования и т. д.);
уровень 3: прикладные программы пользователя.
►Аппаратные средства процессора, работающего в защищенном режиме, постоянно контролируют, что текущая программа достаточно привилегированна для того, чтобы:
выполнять некоторые команды, называемые привилегированными;
выполнять операции ввода/вывода на том или ином внешнем устройстве;
обращаться к данным других программ;
передавать управление внешнему (по отношению к самой программе) коду командами межсегментной передачи управления.
Привилегированные команды - это те команды, которые влияют на механизмы управления памятью, защиты и некоторые другие жизненно важные функции. Это, например, команды загрузки таблиц дескрипторов GDT, IDT, LDT, команды обмена с регистрами управления CRi. Они могут выполняться только программами, имеющими наивысший (нулевой) уровень привилегий. Это приводит к тому, что простую незащищенную систему можно целиком реализовать только в кольце 0, так как в других кольцах защиты не будут доступны все команды.
Операции ввода/вывода разрешено выполнять программам, уровень привилегий которых не ниже значения, установленного в полеIOPL регистра флагов, т.е. должно выполняться соотношение: CPL IOPL.
Обращение к данным других программ разрешается только на своем и менее привилегиро-ванном уровнях (рис. 2).
Рис. 2. Порядок взаимодействия программ и данных на разных уровнях привилегий
Передачи управления между программами ограничиваются только текущим кольцом защиты.
► В то же время в процессе выполнения любой программы необходимо обращаться к программам, находящимся на более высоком уровне привилегий, например, к драйверам или СУБД.
Для этих целей используются специально установленные точки входа в эти программы (шлюзы).
►Передача управления на более низкий уровень привилегий осуществляется с помощью механизма подчиненных сегментов.
При передаче управления подчиненному сегменту действует правило: DPL max (CPL, RPL).
Однако при этом подчиненный код будет выполняться на том же уровне привилегий, что и вызвавший его код (CPL не изменится).
Ограничивая передачу управления в пределах одного кольца защиты, процессор предотвращает произвольное изменение уровней привилегий. Если бы значение CPL можно было легко изменить, все остальные средства защиты по привилегиям потеряли бы смысл.