Под защитой понимается ограничение доступа процессов к ресурсам, принадлежащим другим процессам или операционной системе. Наиболее используемым ресурсом в МПС является память, поэтому рассмотрим схему защиты памяти в МП Intel x86.
Защита памяти
Вспомним, как был организован доступ к памяти в процессоре Intel 8086, первом из рассматриваемой серии, в котором не предусматривалось никакой зашиты. Процессор имел адресное пространство объемом 1 мегабайт. Логический адрес, указываемый в команде МП, состоял из двух 16-разрядных частей — начального адреса сегмента (или просто "сегмента") и смещения относительно начала сегмента (рис. 1).
Рис. 1.  
Получив логический адрес, блок преобразования адресов МП вычислял физический адрес ячейки ЗУ в соответствии со следующей схемой (рис. 2).
Рис. 2.  
Начальный адрес сегмента сдвигается на 4 бита влево, к нему прибавляется смещение. В результате получается физический адрес ячейки ЗУ, который и выдается на шину адреса.
При такой адресации логический адрес в сегменте и смещении содержит части реального физического адреса ячейки ЗУ. Поэтому такой режим работы МП получил название "реального" режима работы. В реальном режиме, изменяя значение смещения, можно свободно перемещаться по ЗУ в пределах одного сегмента (64 килобайта), изменяя значение сегмента можно перемещаться по всему ЗУ (с шагом 16 байт).
Таким образом, в реальном режиме любой программе доступно все ЗУ. Хорошо это или плохо? С одной стороны хорошо, так как такая схема обеспечивает большую гибкость программы. Программа может, например, изменить вектор прерывания, промодифицировать свой собственный код, обратиться напрямую к областям памяти, занимаемым операционной системой. С другой стороны это плохо, так как в случае ошибки в вычислении адреса в программе может быть случайно промодифицирована не та область памяти и это приведет к "порче" кода программы, или, что еще хуже, операционной системы. Для того чтобы случайные модификации "чужих" областей памяти были невозможны, и был реализован механизм защиты. Режим работы процессора, в котором реализуется механизм защиты памяти, получил название "защищенного" режима. Защищенный режим впервые появился в процессоре Intel 80286 (1982 год).
Базовым понятием защищенного режима является понятие сегмента. Под сегментом понимается область памяти, расположенная в определенном месте, имеющая определенный размер, выделенная процессу операционной системой, доступ к которой контролируется микропроцессором.
Если в реальном режиме программа могла обратиться к любой области памяти, то в защищенном режиме она может обратиться только к сегменту, выделенному ей ОС, причем возможность обращения к конкретному сегменту контролируется МП.
Для того чтобы МП имел возможность контролировать обращения к сегментам, каждый сегмент имеет описатель дескриптор сегмента. Формат дескриптора представлен на рис. 3.
Рис. 3.  
Дескриптор сегмента имеет размер 8 байт и состоит из четырех полей:
Дескрипторы всех сегментов, существующих на данный момент, хранятся в таблице дескрипторов. Существует глобальная таблица дескрипторов (GDT), хранящая дескрипторы сегментов, доступных всем задачам (процессам). Кроме того, каждая задача имеет свою локальную таблицу дескрипторов (LDT), в ней хранятся дескрипторы сегментов, используемых только данной задачей (процессом).
Так как МП должен иметь информацию обо всех сегментах для контроля доступа к ним, он должен знать, где находятся GDT и LDT. Для этого в МП имеются два специальных регистра, хранящих адреса, соответственно, глобальной и локальной таблиц дескрипторов (рис. 4).
Рис. 4.  
Максимальный размер таблицы дескрипторов — 64 килобайта. Так как каждый дескриптор имеет размер 8 байт, максимальное количество дескрипторов в таблице — 8192. Из этого следует, что количество сегментов, доступных задаче, ограничено.
Рассмотрим теперь, как происходит адресация памяти в защищенном режиме. Логический адрес (тот, который указывается в командах МП), по-прежнему состоит из двух частей — селектора и смещения (рис. 5).
Рис. 5.  
Селектор идентифицирует сегмент, к которому производится обращение. Он представляет собой индекс в таблице дескрипторов, указывающий на дескриптор нужного сегмента. Смещение представляет собой смещение нужной ячейки памяти относительно начала сегмента. Алгоритм вычисления адреса в защищенном режиме представлен на рис. 6.
Рис. 6.  
Так как дескриптор может находиться в GDT или в LDT, селектор содержит специальный бит, определяющий, из какой конкретно таблицы необходимо взять дескриптор.
Из рисунка видно, что при каждом обращении к памяти МП использует дескриптор сегмента. Таким образом, он имеет возможность проверить возможность доступа к запрошенному сегменту, используя поле "Доступ" дескриптора.
Проверка возможности доступа выполняется с использованием понятия привилегий. Каждая задача, выполняемая МП, имеет один их четырех уровней привилегий:
Уровень привилегий текущей задачи () известен МП. Дескриптор каждого сегмента содержит минимальный уровень привилегий (), необходимый для доступа к сегменту. Если текущий уровень привилегий , доступ к сегменту разрешается, в противном случае – запрещается. Например, если прикладная задача () попытается обратиться к сегменту, относящемуся к ОС (), доступ будет запрещен. Если же ОС () обращается к сегменту прикладной задачи (), доступ будет разрешен.
Итак, мы рассмотрели механизм защиты памяти в "защищенном" режиме работы МП. Подведем итог. Механизм защиты памяти позволяет:
В случае если доступ к запрашиваемому сегменту не может быть предоставлен по одной из перечисленных выше причин, процессор вырабатывает исключение общей ошибки защиты. По сути дела, он инициирует обычное аппаратное прерывание, вызывая соответствующий обработчик прерывания. Этот обработчик, как правило, входит в состав операционной системы (является ее частью), он выполняет необходимые действия вплоть до аварийного завершения выполнения программы.
Привилегированные команды
Одной из разновидностей защиты является использование привилегированных команд для выполнения наиболее ответственных операций. К таким командам в микропроцессорах Intel x86 относятся команды управления процессором, команды работы с таблицами дескрипторов, команды управления защищенным режимом. Они могут быть выполнены только задачей с . В противном случае возникает общая ошибка защиты.
Защита операций ввода-вывода
Важным аспектом защиты является защита операций ввода-вывода, выполняемых командами IN и OUT. Концепция аппаратной независимости, лежащая в основе работы ОС, предполагает, что доступ ко внешним устройствам через операции ввода-вывода может осуществляться только ОС. Выполнение этих команд прикладными программами должно быть ограничено. В процессорах Intel это обеспечивается с использованием рассмотренного выше механизма привилегий. В регистре флагов МП два бита содержат — минимальный уровень привилегий, который должна иметь задача для выполнения операций ввода-вывода. Если , операции ввода-вывода разрешаются. Установив, например, , ОС может запретить прикладным программам любые операции ввода-вывода.
Однако в ряде случаев прикладной программе может потребоваться разрешение на работу с каким-то конкретным портом ввода-вывода. Такое разрешение может быть ей предоставлено с помощью битовой карты ввода-вывода. Для каждой задачи ОС создает битовую карту, в которой каждому адресу порта ВВ соответствует 1 бит. Установкой соответствующего бита в 1 ОС разрешает данной задаче работу с конкретным портом ввода-вывода. Естественно, если , задаче разрешается работа с любым портом независимо от содержимого битовой карты. Такая схема позволяет более гибко контролировать использование задачами портов ВВ, разрешая доступ только к определенным из них.