Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 31
Текст из файла (страница 31)
Нарушение этогоусловия вызывает так называемую особую ситуацию ошибки защиты, ведущую кпрерыванию. Уровень привилегий сегмента данных, к которому осуществляетсяобращение, должен быть таким же, как и текущий уровень, или меньше его. Обращение к сегменту с более высоким уровнем привилегий воспринимается как ошибка, так как существует опасность изменения данных с высоким уровнем привилегий программой с низким уровнем привилегий. Доступ к данным с меньшимуровнем привилегий разрешается.Если целевой сегмент является сегментом стека, то правило проверки имеет вид:CPL = DPL = RPLВ случае его нарушения также возникает исключение.
Поскольку стек может применяться в каждом сегменте кода, и всего имеется четыре уровня привилегий кода,используется четыре стека. Сегмент стека, адресуемый регистром SS, должен иметьтот же уровень привилегий, что и текущий сегмент кода.Правила для передачи управления, когда осуществляется межсегментный переход с одного сегмента кода на другой сегмент кода, несколько сложнее.
Если дляперехода с одного сегмента данных на другой сегмент данных считается допустимым обрабатывать менее привилегированные сегменты, то передача управленияиз более привилегированного кода на менее привилегированный код должна контролироваться дополнительно. Другими словами, код операционной системы неДолжен доверять коду прикладных задач. И обратно, нельзя просто так давать задачам возможность исполнять привилегированный код, хотя потребность в этомвсегда имеется (ведь многие функции, в том числе и функции ввода-вывода, счи-2Иоле RPL определяется программистом (системой программирования).
В отличие от поля DPL полеKPL легко может быть изменено.•значение эффективного уровня привилегий определяется минимальной привилегией, то есть какМаксимальное значение из двух уровней, RPL и DPL.118Глава 4. Особенности архитектуры микропроцессоров 180x86таются привилегированными и должны выполняться только самой операционнойсистемой). Для передачи управления в сегменты кода с иными уровнями привилегий введен механизм шлюзов, который мы вкратце рассмотрим ниже: Более подробное рассмотрение затронутых вопросов выходит за рамки темы данной книги.Для получения более детальных сведений по этому и некоторым другим вопросамособенностей архитектуры микропроцессоров i80x86 рекомендуется обратиться ктаким материалам, как, например, [1, 8].Механизм шлюзов для передачи управленияна сегменты кода с другими уровнямипривилегийПоскольку межсегментные переходы контролируются с использованием уровнейпривилегий, а потребность в передаче управления с одного уровня привилегий надругой уровень имеется, в микропроцессорах i80x86 реализован механизм шлюзов,который мы поясним с помощью рис.
4.9. Шлюзование позволяет организоватьобращение к так называемым подчиненным сегментам кода, которые выполняютчасто встречающиеся функции и должны быть доступны многим задачам, располагающимся на том же или нижележащем уровне привилегий. Часто уровни привилегий называют кольцами защиты, поскольку это иногда помогает объяснитьпринцип действия самого механизма. Часто говорят, что некоторый программныймодуль «исполняется в кольце защиты с номером ...».Помимо дескрипторов сегментов системными объектами, с которыми работаетмикропроцессор, являются специальные системные дескрипторы, названные шлюзами (gates).
Главное различие между дескриптором сегмента и шлюзом вызоваподчиненного сегмента кода заключается в том, что содержимое дескриптора указывает на сегмент в памяти, а шлюз обращается к дескриптору. Другими словами,если дескриптор служит механизмом отображения памяти, то шлюз служит механизмом перенаправления вычислений.Для доступа к более привилегированному коду задача должна обратиться к немуне непосредственно (путем указания дескриптора этого кода), а через шлюз этогосегмента (рис. 4.10).В этом дескрипторе вместо адреса сегмента указываются селектор, позволяющий найти дескриптор искомого сегмента кода, и адрес (смещение назначения),с которого будет выполняться подчиненный сегмент, то есть полный 32-разрядный адрес.
Формат дескриптора шлюза приведен на рис. 4.11. Адресовать шлюзвызова можно с помощью команды CALL или FAR CALL (межсегментный вызов процедуры). По существу, дескрипторы шлюзов вызова не являются дескрипторамисегментов, но могут располагаться среди обычных дескрипторов (в дескрипторных таблицах) процесса.
Смещение, указываемое в команде перехода на другойсегмент (FAR CALL), игнорируется, и фактически осуществляется переход на команду, адрес которой определяется через смещение из шлюза вызова. Этим гарантируется попадание только на разрешенные точки входа в подчиненные сегменты.---шШ119о а щ и т а адресного пространства задачАдресное пространство программны) модулей ОСУровень привилегий ОЗапрашиваемыйпрограммный модуль/\Уровень привилегий 1Уровень привилегий 2Уровень привилегий 3Адресное пространство процесса АШлюзАдресное пространствопроцесса БРис.
4.9. Механизм шлюзов для перехода на другой уровень привилегийВведены следующие правила использования шлюзов:• значение DPL шлюза вызова должно быть больше или равно значению текущего уровня привилегий CPL;• значение DPL шлюза вызова должно быть больше или равно значению поляRPL селектора шлюза;• значение DPL шлюза вызова должно быть больше или равно значению DPLцелевого сегмента кода;• значение DPL целевого сегмента кода должно быть меньше или равно значению текущего уровня привилегий CPL.Требование наличия и доступности шлюза вызова для перехода на более привилегированный код ограничивает менее привилегированный код заданным набором точек входа.
Так как шлюзы вызова являются элементами дескрипторныхтаблиц (а мы говорили, что их не только можно, но и желательно там располагать), то менее привилегированная программа не может создать дополнительНЬ1х (а значит, и неконтролируемых) шлюзов. Таким образом, рассмотренныймеханизм шлюзов дает следующие преимущества в организации среды надежных вычислений.Глава 4. Особенности архитектуры м и к р о п р о ц е с с о р о в 180x86120Q Привилегированный код надежно защищен, и вызывающие его программы не могут его разрушить.
Естественно, что такой системный код должен быть особеннотщательно отлаженным, не содержать ошибок, быть максимально эффективным.•Шлюзы межсегментных переходов для вызова системных функций делают этисамые системные функции невидимыми для программных модулей, расположенных на внешних (более низких) уровнях привилегий.Q Поскольку вызывающая программа непосредственно адресует только шлюз вызова, реализуемые вызываемым модулем (сегментным кодом) функции можно изменить или переместить в адресном пространстве, не затрагивая интерфейс со шлюзом.Q Легко реализуется вызов программных модулей с более привилегированногоуровня.СмещениеСегментCALLДескриптор шлюзаДескриптор сегмента кода.
• • . • • . - , - . • - •высоким'Рис. 4.10. Переход на сегмент более привилегированного кода3123Старшее двойное слово дескриптора191511Смещение назначения (биты 31-16)РDPL01100Байт прав доступаСелектор сегмента назначения31000СчетчикDWORDСмещение назначения (биты 15-0)15Первое (младшее) двойное слово дескриптораРис. 4 . 1 1 . Формат дескриптора шлюзаЗащита адресного пространства задач121Изложенный вкратце аппаратный механизм защиты по привилегиям оказываетсядовольно сложным и жестким.
Однако поскольку все практические ситуации учестьв схемах микропроцессора невозможно, то при разработке процедур операционных систем и иного привилегированного кода следует придерживаться приведенных ниже рекомендаций, заимствованных из [8].Основной риск связан с передачей управления через шлюз вызова более привилегированной процедуре. Нельзя предоставлять вызывающей программе никакихпреимуществ, вытекающих из-за временного повышения привилегий. Это особенноважно для процедур нулевого уровня привилегий (PLO-процедур).Вызывающая программа может нарушить работу процедуры, передавая ей «плохие» параметры. Поэтому целесообразно как можно раньше проконтролироватьпередаваемые процедуре параметры. Шлюз вызова сам по себе не проверяет значений параметров, которые копируются в новый стек, поэтому достоверность каждого передаваемого параметра должна контролировать вызванная процедура.