Уровни привилегий для защиты адресного пространства задач

Для того чтобы запретить пользовательским задачам модифицировать области памяти, принадлежащие самой операционной системе, необходимо иметь специ­альные средства. Одного разграничения адресных пространств через механизм сег­ментов мало, ибо можно указывать различные значения адреса начала сегмента и тем самым получать доступ к чужим сегментам. Другими словами, необходимо в явном виде отделять системные сегменты данных и кода от сегментов, принадле­жащих пользовательским программам. Поэтому были введены два основных ре-

116_______________ Глава 4. Особенности архитектуры микропроцессоров i80x86

жима работы процессора: режим пользователя и режим супервизора. Большин­ство современных процессоров поддерживают по крайней мере два этих режима. Так, в режиме супервизора программа может выполнять все действия и иметь дос­туп по любым адресам, тогда как в пользовательском режиме должны быть ограни­чения, с тем чтобы обнаруживать и пресекать запрещенные действия, перехватывая их и передавая управление супервизору операционной системы. Часто в пользо­вательском режиме запрещается выполнение команд ввода-вывода и некоторых других, чтобы гарантировать выполнение этих операций только операционной системой.

В микропроцессорах i80x86 режим супервизора и режим пользователя непосред­ственно связаны с так называемыми уровнями привилегий, причем имеется не два, а четыре уровня привилегий. Для указания уровня привилегий используются два бита, поэтому код 0 обозначает самый высший уровень, а код 3 — самый низший. Самый высший уровень привилегий предназначен для операционной системы (прежде всего для ядра ОС), самый низший — для прикладных задач пользовате­ля. Промежуточные уровни привилегий введены для большей свободы системных программистов в организации надежных вычислений при создании операционной системы и иного системного программного обеспечения. Предполагалось, что уро­вень с номером (кодом) 1 может быть использован, например, для системного сер­виса — программ обслуживания аппаратуры, драйверов, работающих с портами ввода-вывода. Уровень привилегий с кодом 2 может быть использован для созда­ния пользовательских интерфейсов, систем управления базами данных и прочи­ми, то есть для реализации специальных системных функций, которые по отноше­нию к супервизору операционной системы ведут себя как обычные приложения. Так, например, в системе OS/2 доступны три уровня привилегий: с нулевым уров­нем привилегий исполняется код супервизорной части операционной системы, на втором уровне исполняются системные процедуры подсистемы ввода-вывода, на третьем уровне исполняются прикладные задачи пользователей. Однако на прак­тике чаще всего задействуются только два уровня — нулевой и третий. Таким об­разом, упомянутый режим супервизора для микропроцессоров i80x86 соответствует выполнению кода с уровнем привилегий 0, обозначаемый как PLO (Privilege Level 0 — уровень привилегий 0). Подводя итог, можно констатировать, что именно уровень привилегий задач определяет, какие команды в них можно использовать и какое подмножество сегментов и/или страниц в их адресном пространстве они могут обрабатывать.

Основными системными объектами, которыми манипулирует процессор при ра­боте в защищенном режиме, являются дескрипторы. Именно дескрипторы сегмен­тов содержат информацию об уровне привилегий соответствующего сегмента кода или данных. Уровень привилегий исполняющейся задачи определяется значени­ем поля привилегий, находящегося в дескрипторе ее текущего кодового сегмента. Напомним (см. рис. 4.3), что в байте прав доступа каждого дескриптора сегмента имеется поле DPL (Descriptor Privilege Level — уровень привилегий сегмента, оп­ределяемый его дескриптором), которое и определяет уровень привилегий связан­ного с ним сегмента. Таким образом, поле DPL текущего сегмента кода становится полем текущего уровня привилегий (Current Privilege Level, CPL), или уровня при-

Защита адресного пространства задач____________________________________ 117

вилегий задачи. При обращении к какому-нибудь сегменту в соответствующем се­лекторе указывается (см. рис. 4.4) запрашиваемый уровень привилегий (Requested Privilege Level, RPL)1.

В пределах одной задачи используются сегменты с различными уровнями приви­легий, и в определенные моменты времени выполняются или обрабатываются сег­менты с соответствующими им уровнями привилегий. Механизм проверки приви­легий работает в ситуациях, которые можно назвать межсегментными переходами (обращениями). К этим ситуациям относятся доступ к сегменту данных или сте­ковому сегменту, межсегментные передачи управления в случае прерываний (и особых ситуаций), использование команд CALL, JMP, INT, IRET, RET. В таких меж­сегментных обращениях участвуют два сегмента: целевой сегмент (к которому мы обращаемся) и текущий сегмент кода, из которого идет обращение.

Процессор сравнивает упомянутые значения CPL, RPL, DPL и на основе понятия эффективного уровня привилегий (Effective Privilege Level, EPL)2 ограничивает возможности доступа к сегментам по следующим правилам, в зависимости от того, идет ли речь об обращении к коду или к данным.

При доступе к сегментам данных проверяется условие CPL < EPL. Нарушение этого условия вызывает так называемую особую ситуацию ошибки защиты, ведущую к прерыванию. Уровень привилегий сегмента данных, к которому осуществляется обращение, должен быть таким же, как и текущий уровень, или меньше его. Обра­щение к сегменту с более высоким уровнем привилегий воспринимается как ошиб­ка, так как существует опасность изменения данных с высоким уровнем привиле­гий программой с низким уровнем привилегий. Доступ к данным с меньшим уровнем привилегий разрешается.

Если целевой сегмент является сегментом стека, то правило проверки имеет вид:

CPL = DPL = RPL

В случае его нарушения также возникает исключение. Поскольку стек может при­меняться в каждом сегменте кода, и всего имеется четыре уровня привилегий кода, используется четыре стека. Сегмент стека, адресуемый регистром SS, должен иметь тот же уровень привилегий, что и текущий сегмент кода.

Правила для передачи управления, когда осуществляется межсегментный пере­ход с одного сегмента кода на другой сегмент кода, несколько сложнее. Если для перехода с одного сегмента данных на другой сегмент данных считается допусти­мым обрабатывать менее привилегированные сегменты, то передача управления из более привилегированного кода на менее привилегированный код должна кон­тролироваться дополнительно. Другими словами, код операционной системы не должен доверять коду прикладных задач. И обратно, нельзя просто так давать за­дачам возможность исполнять привилегированный код, хотя потребность в этом всегда имеется (ведь многие функции, в том числе и функции ввода-вывода, счи-

Уровни привилегий для защиты адресного пространства задач - student2.ru ' Поле RPL определяется программистом (системой программирования). В отличие от поля DPL поле

RPL легко может быть изменено. 2 Значение эффективного уровня привилегий определяется минимальной привилегией, то есть как

максимальное значение из двух уровней, RPL и DPL

118_______________ Глава 4, Особенности архитектуры микропроцессоров i80x86

таются привилегированными и должны выполняться только самой операционной системой). Для передачи управления в сегменты кода с иными уровнями приви­легий введен механизм шлюзов, который мы вкратце рассмотрим ниже. Более по­дробное рассмотрение затронутых вопросов выходит за рамки темы данной книги. Для получения более детальных сведений по этому и некоторым другим вопросам особенностей архитектуры микропроцессоров i80x86 рекомендуется обратиться к таким материалам, как, например, [1, 8].

Наши рекомендации