Читайте также: |
|
Все пять аспектов защиты используются при сегментной трансляции:
• проверка типа;
• проверка границы;
• ограничение адресуемой области;
• ограничение точек входа в процедуру;
• ограничение набора команд.
Сегмент с позиций защиты - это единица защиты, а дескрипторы сегментов хранят параметры защиты. Проверка защиты выполняется ЦП автоматически в момент загрузки селектора дескриптора сегмента в сегментный регистр и при каждом обращении к сегменту. Сегментные регистры хранят параметры защиты текущих сегментов (сегменты текущего, выполняемого процесса).
Сохраняемые параметры защиты в дескрипторах. На рис. 3.24 показаны поля дескрипторов сегментов, имеющие отношение к защите сегментов.
Параметры защиты помещаются в дескриптор операционной системой в момент создания дескриптора. Обычно программисты-прикладники не имеют дело с параметрами защиты.
Когда программа загружает селектор в сегментный регистр, процессор загружает не только базовый адрес сегмента, но и информацию, связанную с защитой. Каждый сегментный регистр имеет «скрытую»1 часть, в которой сохраняются: база сегмента, предел сегмента, тип и уровень привилегий; поэтому последовательные проверки защиты при обращении к одному и тому же сегменту не связаны с затратой дополнительных тактов.
Проверка типа. Поле «тип дескриптора» имеет две функции:
• устанавливает различие между разными форматами дескрипторов;
• специфицирует функциональное назначение сегмента.
Кроме дескрипторов сегментов данных и кодовых сегментов, обычно используемых прикладными программами, есть еще дескрипторы специальных сегментов, используемые операционной системой и дескрипторы вентилей (шлюзов). Табл. 3.4 содержит все значения поля «тип» для системных сегментов и вентилей.
Заметим, что не все дескрипторы описывают сегменты; дескрипторы вентилей вызова имеют другую цель.
Поля типа дескрипторов сегментов данных и кодовых сегментов включают разряды, которые в дальнейшем определяют степень защиты сегмента (см. рис. 3.24.).
Разряд разрешения записи (W) в дескрипторе сегмента данных указывает, могут ли команды осуществлять запись в этот сегмент.
Разряд разрешения чтения (R) в дескрипторе кодового сегмента указывает, разрешено ли командам читать из сегмента (например, для доступа к константам, которые хранятся в командах). Кодовый сегмент, разрешенный для чтения, может быть прочитан двумя способами:
• через регистр CS, путем использования префикса переопределения CS;
• путем загрузки селектора дескриптора кодового сегмента в регистр сегментов данных (DS, ES, FS nnnGS).
Проверка типа может быть использована для обнаружения ошибок программы, при которых делается попытка использовать сегменты так, как это не предусмотрено программистом. Процессор проверяет информацию типа по двум алгоритмам:
1) когда селектор дескриптора загружается в сегментный регистр; определенные сегментные регистры могут содержать только определенные типы дескрипторов, например: CS- регистр может загружаться только селектором кодового сегмента; селекторы кодовых сегментов, для которых не разрешено чтение, не могут быть загружены в регистры сегментов данных; только селекторы сегментов данных с разрешением записи в сегмент могут быть загружены в регистр SS;
2) когда команда содержит обращение (неявное или явное) к сегментному регистру; определенные сегменты могут быть использованы командами лишь в определенных, наперед заданных случаях, например: никакая команда не может записывать информацию в кодовый сегмент; никакая команда не может записывать информацию в сегмент данных, если разряд разрешения записи не установлен; никакая команда не может прочитать кодовый сегмент, если не установлен разряд разрешения чтения.
Уровни привилегий. Концепция привилегий реализуется посредством задания ключа, принимающего значения от 0 до 3, объектам, распознаваемым процессором. Это значение называется уровнем привилегий. Значение «О» представляет самые большие привилегии, а значение «3» - самые малые. К числу объектов с распознаваемым процессором уровнем привилегий относятся:
• дескрипторы - они содержат поле, называемое уровнем привилегий дескриптора (DPL);
• селекторы - они содержат поле, называемое запрашиваемым уровнем привилегий (RPL),
RPL предназначен для задания уровня привилегий процедуры, которая вызывает (загружает) селектор;
• скрытый в процессоре регистр сегмента хранит текущий уровень привилегий (CPL),
обычно CPL равен DPL сегмента, который процессор выполняет в данный момент.
Процессор автоматически реализует право процедуры на доступ к другому сегменту
путем сравнения CPL с одним или большим числом (из перечисленных выше) других указателей уровня привилегий. Оценивание происходит во время загрузки селектора дескриптора в сегментный регистр. Критерий, используемый для оценки обращений к данным, отличается от критериев оценки передач управления кодовому сегменту, поэтому эти два типа обращений рассматриваются в дальнейшем отдельно.
На рис. 3.25 показано, как уровни привилегий могут интерпретироваться кольцами защиты. Центральное кольцо содержит сегменты части ПО, наиболее критичной с позиций защиты, обычно ядра операционной системы. Другие кольца используются под сегменты, менее критичные с точки зрения защиты.
Можно и не использовать все четыре уровня привилегий. Существующие системы ПО спроектированы как одно- или двухуровневые. Такие системы просто игнорируют другие уровни.
Одноуровневая система должна использовать уровень «О». Двухуровневая система должна использовать уровни «О» и «3».
Ограничение доступа к данным. Прежде чем программа сможет обратиться к операндам, она должна загрузить селектор соответствующего сегмента данных в сегментный регистр данных (DS, ES, FS, GS, SS). Процессор автоматически оценивает обращение к сегменту данных путем сравнения уровней привилегий. Эта оценка обращения происходит в момент загрузки селектора для дескриптора сегмента назначения в сегментный регистр данных. Как следует из рис. 3.26, в проверке привилегий участвуют три значения уровня привилегий:
• CPL (текущий уровень привилегий);
• RPL (уровень привилегий источника обращений к сегменту) из селектора, используемый для спецификации сегмента назначения;
• DPL дескриптора сегмента назначения.
Команды могут загрузить сегментный регистр данных (и затем использовать целевой сегмент), лишь если DPL целевого сегмента численно больше или равен максимальному из значений CPL и RPL селектора. Другими словами, процедура может иметь доступ к данным того же самого или менее привилегированного уровня.
Разрешенная для адресации область задачи изменяется, когда изменяется CPL. Если CPL - нулевое, сегменты данных всех уровней привилегий доступны. Когда CPL = 1, доступны только данные с уровнями привилегий от 1 до 3. Когда CPL равно 3, доступны только сегменты данных с уровнем привилегий 3. Это свойство может быть использовано, например, чтобы предотвратить возможность чтения или изменения таблиц операционной системы прикладной программой.
Доступность данных в кодовых сегментах. Менее общий характер, чем использование сегментов данных, носит работа с данными, сохраняемыми в кодовых сегментах. Кодовые сегменты могут на совершенно законном основании содержать константы, нельзя только что-либо писать в кодовый сегмент. Возможны следующие варианты доступа к данным в кодовом сегменте:
• загрузить регистр сегмента данных селектором несогласованного, с разрешением чтения кодового сегмента;
• загрузить регистр сегмента данных селектором кодового сегмента, который является согласованным и разрешенным для чтения;
• использовать префикс переопределения CS, чтобы прочитать разрешенный для чтения кодовый сегмент, селектор которого уже загружен в CS регистр.
В 1-м случае используются те же самые правила доступа, как и для доступа к сегментам данных. Во 2-м случае доступ корректен, так как уровень привилегий согласованных сегментов является, по существу, тем же самым, что и CPL независимо от DPL. В 3-м случае обращение правильное, так как DPL кодового сегмента в CS является при переопределении равным CPL.
Ограничения передач управления. Передачи управления осуществляются МП по командам JMP, CALL, INT и RET, а также при прерываниях и исключениях. В этой главе обсуждаются передачи управления по командам JMP, CALL, и RET.
Так называемые «близкие» передачи управления по командам JMP, CALL, и RET предполагают передачи управления в пределах исполняемого (текущего) кодового сегмента, и поэтому проверяются только на границу сегмента. Процессор реализует только те передачи управления, которые не превышают границу исполняемого сегмента. Предел сегмента находится в скрытом CS-регистре, а потому проверка защиты для «близких» передач управления не требует дополнительных тактовых циклов.
Операнды так называемых «дальних» передач управления, осуществляемых по командам JMP и CALL, находятся в других сегментах. Возможны два варианта передач управления другому сегменту по командам JMP и CALL:
• операнд команды - это дескриптор другого кодового сегмента;
• операнд команды - это дескриптор вентиля вызова.
Векторизация передач управления через вентили вызова будет рассматриваться позднее.
Рис. 3.27 показывает, что при проверке привилегий для передач управления, которые не используют вентиль вызова, контролируются два различных уровня привилегий:
• CPL (текущий уровень привилегий);
• DPL дескриптора вызываемого сегмента.
Обычно CPL равен DPL сегмента, который в данный момент выполняет процессор, CPL может, однако, быть больше (по величине), чем DPL, если в дескрипторе выполняемого сегмента установлен бит согласования (С = 1).
Процессор разрешает обращения непосредственно к другому сегменту, если удовлетворяется одно из двух правил привилегий:
• DPL целевого сегмента равен CPL;
• разряд согласования дескриптора целевого кодового сегмента установлен (С = 1), a DPL целевого сегмента меньше или равен CPL.
Кодовый сегмент, разряд согласования дескриптора которого установлен, называется согласованным сегментом.
Механизм согласования позволяет обращаться к процедурам из сегментов с разным уровнем привилегий и при этом выполнять их на уровне привилегий вызывающего сегмента. Примерами таких процедур являются различные библиотеки процедур и некоторые процедуры обработки исключений. Когда управление передается согласованному сегменту, CPL не изменяется, но это происходит лишь в случае неравенства CPL и DPL текущего кодового сегмента. Большинство кодовых сегментов не согласованы.
Основные правила привилегий, описанные выше, означают, что для несогласованных сегментов управление может быть передано без использования вентиля вызова лишь кодовым сегментам на том же уровне привилегий. Нужно, однако, передавать управление и сегментам с (численно) меньшим уровнем привилегий, это обеспечивается передачей управления по команде CALL через дескрипторы вентилей вызова. Команды JMP никогда не передают управление несогласованному сегменту, DPL которых не равен CPL.
Дата добавления: 2015-07-11; просмотров: 73 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ЗАЩИТА ПАМЯТИ | | | Общее понятие о памяти |