русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Организация защиты


Дата добавления: 2015-08-14; просмотров: 1275; Нарушение авторских прав


Под защитой понимается ограничение доступа процессов к ресурсам, принадлежащим другим процессам или операционной системе. Наиболее используемым ресурсом в МПС является память, поэтому рассмотрим схему защиты памяти в МП Intel x86.

Защита памяти

Вспомним, как был организован доступ к памяти в процессоре Intel 8086, первом из рассматриваемой серии, в котором не предусматривалось никакой зашиты. Процессор имел адресное пространство объемом 1 мегабайт. Логический адрес, указываемый в команде МП, состоял из двух 16-разрядных частей — начального адреса сегмента (или просто "сегмента") и смещения относительно начала сегмента (рис. 1).

Рис. 1.

Получив логический адрес, блок преобразования адресов МП вычислял физический адрес ячейки ЗУ в соответствии со следующей схемой (рис. 2).

Рис. 2.

Начальный адрес сегмента сдвигается на 4 бита влево, к нему прибавляется смещение. В результате получается физический адрес ячейки ЗУ, который и выдается на шину адреса.

При такой адресации логический адрес в сегменте и смещении содержит части реального физического адреса ячейки ЗУ. Поэтому такой режим работы МП получил название "реального" режима работы. В реальном режиме, изменяя значение смещения, можно свободно перемещаться по ЗУ в пределах одного сегмента (64 килобайта), изменяя значение сегмента можно перемещаться по всему ЗУ (с шагом 16 байт).

Таким образом, в реальном режиме любой программе доступно все ЗУ. Хорошо это или плохо? С одной стороны хорошо, так как такая схема обеспечивает большую гибкость программы. Программа может, например, изменить вектор прерывания, промодифицировать свой собственный код, обратиться напрямую к областям памяти, занимаемым операционной системой. С другой стороны это плохо, так как в случае ошибки в вычислении адреса в программе может быть случайно промодифицирована не та область памяти и это приведет к "порче" кода программы, или, что еще хуже, операционной системы. Для того чтобы случайные модификации "чужих" областей памяти были невозможны, и был реализован механизм защиты. Режим работы процессора, в котором реализуется механизм защиты памяти, получил название "защищенного" режима. Защищенный режим впервые появился в процессоре Intel 80286 (1982 год).



Базовым понятием защищенного режима является понятие сегмента. Под сегментом понимается область памяти, расположенная в определенном месте, имеющая определенный размер, выделенная процессу операционной системой, доступ к которой контролируется микропроцессором.

Если в реальном режиме программа могла обратиться к любой области памяти, то в защищенном режиме она может обратиться только к сегменту, выделенному ей ОС, причем возможность обращения к конкретному сегменту контролируется МП.

Для того чтобы МП имел возможность контролировать обращения к сегментам, каждый сегмент имеет описатель дескриптор сегмента. Формат дескриптора представлен на рис. 3.

Рис. 3.

Дескриптор сегмента имеет размер 8 байт и состоит из четырех полей:

  • Базовый адрес (32 бита) – начальный адрес сегмента (адрес первой ячейки сегмента);
  • Лимит (16 бит) – размер сегмента, максимальное значение смещения при обращении к ячейкам сегмента;
  • Доступ — поле размером 8 бит, определяющее правила доступа к сегменту. Включает следующие признаки:
    • минимальный уровень приоритета, который должна иметь задача для того, чтобы получить доступ к сегменту (подробнее об уровнях приоритета чуть позже);
    • тип сегмента — сегмент кода (содержит команды МП) или сегмент данных;
    • для сегмента кода — разрешение чтения (запись в сегмент кода всегда запрещена);
    • для сегмента данных — разрешение записи (чтение разрешено всегда);
  • Резерв — 1 байт, не используемый процессором. Может быть использован для хранения ОС какой-либо информации.

Дескрипторы всех сегментов, существующих на данный момент, хранятся в таблице дескрипторов. Существует глобальная таблица дескрипторов (GDT), хранящая дескрипторы сегментов, доступных всем задачам (процессам). Кроме того, каждая задача имеет свою локальную таблицу дескрипторов (LDT), в ней хранятся дескрипторы сегментов, используемых только данной задачей (процессом).

Так как МП должен иметь информацию обо всех сегментах для контроля доступа к ним, он должен знать, где находятся GDT и LDT. Для этого в МП имеются два специальных регистра, хранящих адреса, соответственно, глобальной и локальной таблиц дескрипторов (рис. 4).

Рис. 4.

Максимальный размер таблицы дескрипторов — 64 килобайта. Так как каждый дескриптор имеет размер 8 байт, максимальное количество дескрипторов в таблице — 8192. Из этого следует, что количество сегментов, доступных задаче, ограничено.

Рассмотрим теперь, как происходит адресация памяти в защищенном режиме. Логический адрес (тот, который указывается в командах МП), по-прежнему состоит из двух частей — селектора и смещения (рис. 5).

Рис. 5.

Селектор идентифицирует сегмент, к которому производится обращение. Он представляет собой индекс в таблице дескрипторов, указывающий на дескриптор нужного сегмента. Смещение представляет собой смещение нужной ячейки памяти относительно начала сегмента. Алгоритм вычисления адреса в защищенном режиме представлен на рис. 6.

Рис. 6.

Так как дескриптор может находиться в GDT или в LDT, селектор содержит специальный бит, определяющий, из какой конкретно таблицы необходимо взять дескриптор.

Из рисунка видно, что при каждом обращении к памяти МП использует дескриптор сегмента. Таким образом, он имеет возможность проверить возможность доступа к запрошенному сегменту, используя поле "Доступ" дескриптора.

Проверка возможности доступа выполняется с использованием понятия привилегий. Каждая задача, выполняемая МП, имеет один их четырех уровней привилегий:

  • уровень 0 — наивысший, его имеют процессы ядра ОС.
  • уровень 1 — драйвера ОС, обеспечивающие взаимодействие с оборудованием.
  • уровень 2 — расширения ОС.
  • уровень 3 — наинизший, для прикладных программ.

Уровень привилегий текущей задачи ( ) известен МП. Дескриптор каждого сегмента содержит минимальный уровень привилегий ( ), необходимый для доступа к сегменту. Если текущий уровень привилегий , доступ к сегменту разрешается, в противном случае – запрещается. Например, если прикладная задача ( ) попытается обратиться к сегменту, относящемуся к ОС ( ), доступ будет запрещен. Если же ОС ( ) обращается к сегменту прикладной задачи ( ), доступ будет разрешен.

Итак, мы рассмотрели механизм защиты памяти в "защищенном" режиме работы МП. Подведем итог. Механизм защиты памяти позволяет:

  • Контролировать использование памяти (программа может обратиться только к тем областям памяти, который выделены ОС для использования в виде сегментов). Программа не может использовать селектор, указывающий на несуществующий дескриптор, это контролируется МП.
  • Контролировать длину сегмента – программа не может указать смещение, превышающее лимит, указанный в дескрипторе и таким образом выйти за пределы сегмента, испортив, возможно, при этом какие-либо данные.
  • Контролировать тип доступа (можно запретить чтение из сегмента кода и запись в сегмент данных).
  • Контролировать права доступа с использованием привилегий, защитив таким образом ОС от повреждения со стороны прикладных программ.
  • Контролировать модификации таблиц дескрипторов — таблицы дескрипторов могут быть модифицированы только процессом с максимальным уровнем привилегий.

В случае если доступ к запрашиваемому сегменту не может быть предоставлен по одной из перечисленных выше причин, процессор вырабатывает исключение общей ошибки защиты. По сути дела, он инициирует обычное аппаратное прерывание, вызывая соответствующий обработчик прерывания. Этот обработчик, как правило, входит в состав операционной системы (является ее частью), он выполняет необходимые действия вплоть до аварийного завершения выполнения программы.

Привилегированные команды

Одной из разновидностей защиты является использование привилегированных команд для выполнения наиболее ответственных операций. К таким командам в микропроцессорах Intel x86 относятся команды управления процессором, команды работы с таблицами дескрипторов, команды управления защищенным режимом. Они могут быть выполнены только задачей с . В противном случае возникает общая ошибка защиты.

Защита операций ввода-вывода

Важным аспектом защиты является защита операций ввода-вывода, выполняемых командами IN и OUT. Концепция аппаратной независимости, лежащая в основе работы ОС, предполагает, что доступ ко внешним устройствам через операции ввода-вывода может осуществляться только ОС. Выполнение этих команд прикладными программами должно быть ограничено. В процессорах Intel это обеспечивается с использованием рассмотренного выше механизма привилегий. В регистре флагов МП два бита содержат — минимальный уровень привилегий, который должна иметь задача для выполнения операций ввода-вывода. Если , операции ввода-вывода разрешаются. Установив, например, , ОС может запретить прикладным программам любые операции ввода-вывода.

Однако в ряде случаев прикладной программе может потребоваться разрешение на работу с каким-то конкретным портом ввода-вывода. Такое разрешение может быть ей предоставлено с помощью битовой карты ввода-вывода. Для каждой задачи ОС создает битовую карту, в которой каждому адресу порта ВВ соответствует 1 бит. Установкой соответствующего бита в 1 ОС разрешает данной задаче работу с конкретным портом ввода-вывода. Естественно, если , задаче разрешается работа с любым портом независимо от содержимого битовой карты. Такая схема позволяет более гибко контролировать использование задачами портов ВВ, разрешая доступ только к определенным из них.

Организация переключения задач

Переключением задач занимается модуль ОС, называемый диспетчером процессов. По сути дела, переключение задач представляет собой передачу управления от одной задачи (процесса) другой задаче (процессу). Это может быть сделано с помощью команд МП JMP (безусловный переход) или CALL (вызов подпрограммы).

Однако есть одна особенность. Переключение задач должно выполняться незаметно для самих исполняемых задач. Следовательно, перед тем, как активизировать другую задачу, необходимо сохранить где-то адрес следующей исполняемой команды данной задачи (для того, чтобы потом продолжить ее выполнение с этого же места), а также содержимое всех внутренних регистров МП (для того, чтобы при возобновлении выполнения данной задачи восстановить содержимое всех регистров, сделав сам факт переключения незаметным для задачи). Очевидно, что задачу сохранения/восстановления контекста может решить только сам МП, и делать это он должен автоматически при переключении задачи операционной системой. Поддержка операции переключения задач появилась впервые в процессоре Intel 80286.

Для сохранения контекста задачи используется специальная область памяти, называемая сегментом состояния задачи (TSS — Task State Segment). TSS создается ОС для каждой задачи. Обобщенный формат TSS приведен на рис. 1.

Рис. 1.

Процессор имеет специальный регистр, в котором хранится адрес TSS текущей задачи. Для выполнения переключения на другую задачу необходимо выполнить команду JMP или CALL, указав в качестве адреса перехода селектор дескриптора TSS. Процессор обнаруживает, что указанный селектор соответствует дескриптору TSS и выполняет следующие действия:

  1. Сохраняет контекст текущей задачи в ее TSS.
  2. Восстанавливает контекст активизируемой задачи из ее TSS.
  3. Передает управление новой задаче по адресу последней выполнявшейся команды, взятому из TSS.

Если селектор дескриптора TSS указать в таблице векторов прерываний в качестве адреса подпрограммы обработки прерывания, при возникновении этого прерывания управление будет автоматически передано задаче, соответствующей указанному TSS. Это позволяет легко реализовать диспетчеризацию процессов. Достаточно в обработчике прерываний указать TSS задачи — диспетчера процессов, а для активизации этого прерывания использовать сигнал от программируемого таймера. При поступлении сигнала от таймера управление будет передано диспетчеру процессов, который, в свою очередь, выполнив перепланирование, передаст управление какому-то процессу в соответствии с логикой своей работы.



<== предыдущая лекция | следующая лекция ==>
Диспетчеры операционных систем | Организация виртуальной памяти


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.058 сек.