Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SysSoft.doc
Скачиваний:
520
Добавлен:
16.03.2016
Размер:
4.36 Mб
Скачать

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

Для возможности создания надёжных мультипрограммных ОС в процессорах се­мейства i80x86 имеется несколько механизмов защиты. Это и разделение адрес­ных пространств задач, и введение уровней привилегий для сегментов кода и сегментов данных. Все это позволяет обеспечить как защиту задач друг от друга, так и защиту самой операционной системы от прикладных задач, защиту одной части ОС от других её компонентов, защиту самих задач от некоторых своих собственных ошибок.

Защита адресного пространства задач осуществляется относительно легко за счёт того, что каждая задача может иметь свое собственное локальное адресное про­странство. Операционная система должна корректно манипулировать табли­цами трансляции сегментов (дескрипторными таблицами) и таблицами трансляции страничных кадров. Сами таблицы дескрипторов как сегменты данных (а соответственно, в свою очередь, и как страничные кадры) относятся к адрес­ному пространству операционной системы и имеют соответствующие привилегии доступа; исправлять их задачи не могут. Этими информационными структурами процессор пользуется сам, на аппаратном уровне, без возможности их читать и редактировать из пользовательских приложений. Если используется модель плоской памяти, то возможность микропроцессора контролировать обращения к памяти только внутри текущего сегмента фактически не используется, и оста­ется в основном только механизм отображения страничных кадров. Выход за пределы страничного кадра невозможен, поэтому фиксируется только выход за пределы своего сегмента. В этом случае приходится полагаться только на сис­тему программирования, которая должна корректно распределять программные модули в пределах единого неструктурированного адресного пространства зада­чи. Поэтому при создании многопоточных приложений, когда каждая задача (в данном случае – поток) может испортить адресное пространство другой зада­чи, эта проблема становится очень сложной, особенно если не использовать сис­темы программирования на языках высокого уровня.

Однако для организации взаимодействия задач, имеющих разные виртуальные адресные пространства, необходимо, как мы уже говорили, иметь общее адресное пространство. И здесь, для обеспечения защиты самой ОС, а значит, и повыше­ния надёжности всех вычислений, используется механизм защиты сегментов с помощью уровней привилегий.

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

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

В микропроцессорах i80x86 имеются не два, а четыреуровня привилегий.Часто уровни привилегий называют кольцами защиты, поскольку это иногда помогает объяснить принцип действия самого механизма; поэтому говорят, что некоторый программный модуль «исполняется в кольце защиты с таким-то номером». Для указания уровня привилегий используются два бита, поэтому код 00 обознача­ет самый высший уровень, а код 11(2)(=3) – самый низший. Самый высокий уровень привилегий предназначен для операционной системы (прежде всего, для ядра ОС), самый низкий – для прикладных задач пользователя. Промежуточ­ные уровни привилегий введены для большей свободы системных программистов в организации надёжных вычислений при создании ОС и иного системного ПО. Предполагалось, что уровень с номером (кодом) 1 может быть использован, на­пример, для системного сервиса – программ обслуживания аппаратуры, драйве­ров, работающих с портами ввода/вывода. Уровень привилегий с кодом 2 может быть использован для создания пользовательских интерфейсов, систем управле­ния базами данных и т. п., то есть для реализации специальных системных функ­ций, которые по отношению к супервизору ОС ведут себя как обычные приложе­ния. Так, например, система OS/2 использует три уровня привилегий: с нулевым уровнем привилегий исполняется код самой ОС, на втором уровне исполняются системные процедуры подсистемы ввода/вывода, на третьем уровне исполня­ются прикладные задачи пользователей. Однако чаще всего на практике исполь­зуются только два уровня – нулевой и третий. Таким образом, упомянутый ре­жим супервизора для микропроцессоровi80x86 соответствует выполнению кода с уровнем привилегий 0 (его обозначают так:PL01). Подводя итог, можно кон­статировать, что именно уровень привилегий задач определяет, какие команды в них можно использовать и какое подмножество сегментов и/или страниц в их адресном пространстве они могут обрабатывать.

Основными системными объектами, которыми манипулирует процессор при ра­боте в защищённом режиме, являются дескрипторы. Дескрипторы сегментов содержат информацию об уровне привилегий соответствующего сегмента кода или данных. Уровень привилегии исполняющейся задачи определяется значени­ем поля привилегий, находящегося в дескрипторе её текущего кодового сегмен­та. Напомним, что в каждом дескрипторе сегмента (см. рис.3.3) имеется поле DPLв байте прав доступа, которое и определяет уровень привилегии связанного с ним сегмента. Таким образом, поле DPL текущего сегмента кода становится полемCPL. При обращении к какому-нибудь сегменту в соответствующем се­лекторе указывается запрашиваемый уровень привилегий RPL2(см. рис. 3.4).

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

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

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

Если целевой сегмент является сегментом стека, то правило проверки имеет вид CPL=DPL=RPL.

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

Правила для передачи управления, то есть когда осуществляется межсегментный переход с одного сегмента кода на другой сегмент кода, несколько сложнее. Если для перехода с одного сегмента данных на другой сегмент данных считает­ся допустимым обрабатывать менее привилегированные сегменты, то передача управления из высоко привилегированного кода на менее привилегированный код должна контролироваться дополнительно. Другими словами, код операци­онной системы не должен доверять коду прикладных задач. И обратно, нельзя просто так давать задачам возможность исполнять высоко привилегированный код, хотя потребность в этом всегда имеется (ведь многие функции, в том числе и функции ввода/вывода, считаются привилегированными и должны выпол­няться только самой ОС). Для реализации возможностей передачи управления в сегменты кода с иными уровнями привилегий введен механизм шлюзования, который мы вкратце рассмотрим ниже. Итак, если DPL = CPL, то переход в дру­гой сегмент кода возможен. Более подробное рассмотрение затронутых вопросов по замыслу авторов выходит за рамки настоящего учебника (для получения бо­лее детальных сведений по этому и некоторым другим вопросам особенностей архитектуры микропроцессоров i80x86 рекомендуется обратиться к материалам [1, 8]). Здесь мы рассмотрим только основные идеи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]