Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 30
Текст из файла (страница 30)
следующий раздел), решается аналогично. При попыткевыполнить недопустимые команды (ввода-вывода) возникают прерывания, и необходимые операции выполняются операционной системой, хотя задача об этом и«не подозревает». При выполнении команд IN, OUT, INS, OUTS, CLI, STI процессор,находящийся в виртуальном режиме и исполняющий код на уровне привилегийтретьего (самого нижнего) кольца защиты, за счет возникающих вследствие этогопрерываний переводится на выполнение высоко привилегированного кода операционной системы.Таким образом, операционная система может полностью виртуализировать аппаратные 1 и программные ресурсы компьютера, создавая полноценную операционную среду, отличную от себя самой, ибо существуют так называемые нативные приложения, создаваемые по собственным спецификациям даннойоперационной системы.
Очень важным моментом для организации полноценной виртуальной машины является виртуализация не только программных, нои аппаратных ресурсов. Так, например, в Windows NT эта задача выполненаявно неудачно, тогда как в OS/2 имеется полноценная виртуальная машина какдля DOS-приложеиий, так и для приложений, работающих в среде спецификаций Win 16.
Правда, в последнее время это перестало быть актуальным, поскольку появилось большое количество приложений, работающих по спецификациям Win32 API.Речь идет о памяти, портах ввода-вывода, системе обработки прерываний и других устройствах.^яшита адресного пространства задач115Защита адресного пространства задачДля создания надежных мультипрограммных операционных систем в процессоо а х семейства i80x86 имеется несколько механизмов защиты. Это и разделениеадресных пространств задач, и введение уровней привилегий для сегментов кода исегментов данных. Это позволяет обеспечить как защиту задач друг от друга, так изащиту самой операционной системы от прикладных задач, защиту одной частисистемы от других ее частей, защиту самих задач от некоторых своих собственныхошибок.Защита адресного пространства задач осуществляется относительно легко за счеттого, что каждая задача может иметь свое собственное локальное адресное пространство.
Операционная система должна корректно манипулировать таблицамитрансляции сегментов (дескрипторными таблицами) и таблицами трансляции страничных кадров. Сами таблицы дескрипторов как сегменты данных (а соответственно, в свою очередь, и как страничные кадры) относятся к адресному пространствуоперационной системы и имеют соответствующие привилегии доступа; исправлять их задачи не могут. Этими информационными структурами процессор пользуется сам на аппаратном уровне без возможности их читать и редактировать изпользовательских приложений.
В плоской модели памяти возможность микропроцессора контролировать обращения к памяти только внутри текущего сегментафактически не используется, и остается в основном только механизм отображения страничных кадров. Выход за пределы страничного кадра невозможен, поэтому фиксируется только выход за пределы своего сегмента. В этом случае приходится полагаться только на систему программирования, которая должна корректнораспределять программные модули в пределах единого неструктурированного адресного пространства задачи. Поэтому создание многопоточных приложений, когдакаждая задача (в данном случае — поток выполнения) может испортить адресноепространство другой задачи, — очень сложная проблема, особенно если не применять системы программирования на языках высокого уровня.Итак, чтобы организовать взаимодействие задач, имеющих разные виртуальныеадресные пространства, необходимо, как мы уже говорили, иметь общее адресноепространство.
И здесь для обеспечения защиты самой операционной системы,а значит, и для повышения надежности всех вычислений используется механизмзащиты сегментов с помощью уровней привилегий.Уровни привилегий для защиты адресногопространства задачДля того чтобы запретить пользовательским задачам модифицировать областипамяти, принадлежащие самой операционной системе, необходимо иметь специальные средства. Одного разграничения адресных пространств через механизм сегментов мало, ибо можно указывать различные значения адреса начала сегментаитем самым получать доступ к чужим сегментам.
Другими словами, необходимовявном виде отделять системные сегменты данных и кода от сегментов, принадлежащих пользовательским программам. Поэтому были введены два основных ре-116Глава 4, Особенности архитектуры микропроцессоров J80x86жима работы процессора: режим пользователя и режим супервизора. Большинство современных процессоров поддерживают по крайней мере два этих режима.Так, в режиме супервизора программа может выполнять все действия и иметь доступ по любым адресам, тогда как в пользовательском режиме должны быть ограничения, с тем чтобы обнаруживать и пресекать запрещенные действия, перехватываяих и передавая управление супервизору операционной системы. Часто в пользовательском режиме запрещается выполнение команд ввода-вывода и некоторыхдругих, чтобы гарантировать выполнение этих операций только операционнойсистемой.В микропроцессорах 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) запрашиваемый уровень привилегий (Requestedprivilege Level, RPL)'.В пределах одной задачи используются сегменты с различными уровнями привилегий, и в определенные моменты времени выполняются или обрабатываются сегменты с соответствующими им уровнями привилегий. Механизм проверки привилегий работает в ситуациях, которые можно назвать межсегментными переходами(обращениями). К этим ситуациям относятся доступ к сегменту данных или стековому сегменту, межсегментные передачи управления в случае прерываний(и особых ситуаций), использование команд CALL, JMP, INT, IRET, RET. В таких межсегментных обращениях участвуют два сегмента: целевой сегмент (к которому мыобращаемся) и текущий сегмент кода, из которого идет обращение.Процессор сравнивает упомянутые значения CPL, RPL, DPL и на основе понятия2эффективного уровня привилегий (Effective Privilege Level, EPL) ограничиваетвозможности доступа к сегментам по следующим правилам, в зависимости от того,идет ли речь об обращении к коду или к данным.При доступе к сегментам данных проверяется условие CPL < EPL.