E.2.2. Формирование адреса при страниvчном преобразовании.
Рис. E.5. Страничная организация памяти.
В процессе страничного преобразования старшие 20 бит 32-х битного линейного адреса заменяются новым значением - номером физической страницы. Младшие же 12 бит линейного адреса определяют положение байта внутри страницы и остаются неизменными.
Для уменьшения размера таблицы страниц в микропроцессорах x86 предусмотрена двухуровневая схема преобразования адреса. Основой страничного преобразования служит регистр управления CR3, содержащий 20-ти битный физический базовый адрес каталога страниц текущей задачи. Предполагается, что каталог выровнен по границе страничного кадра, постоянно находится в памяти и не участвует в свопинге.
Корневая страница, называемая каталогом страниц, содержит 1024 32-х битных дескриптора, называемых элементами каталога страниц PDE (Page Directory Entry). Каждый из них адресует подчиненную таблицу страниц. Каждая из этих таблиц содержит 1024 32-х битных дескриптора, называемая элементами таблицы страниц. PTE (Page Table Entry). Каждый PTE содержит адрес страничного кадра в физической памяти.
Собственно преобразование линейных адресов в физические состоит из следующих действий:
- Старшие 10 бит 31 - 22 линейного адреса, дополненные двумя младшими нулями, служат индексом PDE.
- Средние 10 бит 21 - 12 линейного адреса, дополненные двумя младшими нулями, индексируют таблицу страниц PTE. Элемент PTE содержит 20-битный базовый адрес страничного кадра в физической памяти.
Этот базовый адрес из элемента PTE объединяется с младшими 12-ю битами линейного адреса, образуя 32-х битный физический адрес. Пояснение - смотри рисунок E.6.
В элементе таблицы страниц существует бит неприсутствующей страницы. Он означает, что указанной странице нет в памяти и ее необходимо загрузить с внешнего устройства. Также существуют биты, указывающие, происходит ли обращение к страницам. Эти страницы невозможно выгрузить из памяти.
E.4. Уровни защиты.
По мере повышения нашей зависимости от компьютеров пользователям необходимы все более надежные и защищенные системы, способные выполнять несколько задач одновременно. На это рассчитан защищенный режим работы процессора x86. Для того, чтобы прикладная программа пользователя не смогла разрушить систему, каждая группа программ выполняется на своем уровне привилегий. При этом ошибки в программах, имеющих низкий уровень привилегий, никак не отражаются на работе программ, работающих на более высоком уровне привилегий.
Простейшие уровни привилегий, реализованные в ЭВМ 60-х годов - это работа в режимах пользователя (User) и системы, или супервизора (Supervisor). Эта двухуровневая модель хорошо зарекомендовала себя в системах, когда одна большая ЭВМ (операционная система, процесс и т.п.) обслуживала нескольких равноправных пользователей. Двухуровневая система привилегий работает на компьютерах Apple Macintosh вплоть до настоящего времени и в микропроцессорах x86 при страничной организации памяти.
С появлением современных технологий работы вычислительной техники (технологии Клиент-сервер, "тонкие" клиенты, Jini и т.п.) двух уровней привилегий стало не хватать. Предвосхищая эту проблему, фирма Intel предложила в своем процессоре i80386 четырехуровневую систему привилегий на уровне сегмента.
E.4.1. Четырехуровневая система привилегий в микропроцессорах с архитектурой x86.
Процессоры x86 поддерживают четыре уровня привилегий для сегментов программ и данных. Уровень 0 самый привилегированный, уровень 3 наименее привилегированный. Корпорация Intel рекомендует процессам занимать следующие уровни привилегий:
0 - ядро операционной системы;
1 - операционная система;
2 - системы программирования и базы данных;
3 - прикладные (пользовательские) программы.
На каждом уровне привилегий проверяется:
1. Может ли программа выполнить указанную подпрограмму?
2. К данным каких программ может обратиться та или иная программа?
3. Имеет ли программа право передавать управлению внешнему процессу и какому именно?
Рассмотрим накладываемые ограничения:
1. Привилегированные команды, управляющие сегментацией или влияющие на механизм защиты, могут работать только на нулевом уровне привилегий.
2. Программам не разрешается считывать/записывать элементы данных, которые имеют более высокий уровень привилегий. Однако программы могут использовать данные на своем и более низком уровне привилегий.
3. Передача управления внешним процедурам возможна, только если они имеют тот же уровень привилегий, что и исходный процесс.
E.4.2. Передача управления между уровнями привилегий.
Довольно часто встречается ситуация, когда необходимо передать управление между уровнями привилегий. Например, такая ситуация возникает при необходимости вызова стандартной подпрограммы операционной системы из прикладной программы. Или позволить прикладной программе прочитать данные из ядра операционной системы. Поскольку защита по привилегиям не разрешает такие действия напрямую, это осуществляется двумя косвенными методами: с использованием сегментов подчиненного кода и шлюзов вызова.
E.4.2.1. Подчиненные сегменты кода.
Предположим [В.Л. Григорьев, - т. 1 стр. 111] в системе имеется сегмент кода для преобразования двоичных целых чисел в коды ASCII. Ее должны использовать программы со всеми уровнями привилегий. Чтобы ее можно было вызвать из ядра операционной системы, она должна иметь уровень привилегий 0. Для того же, чтобы указать, что данный сегмент должен использоваться программами с другими уровнями привилегий, необходимо установит бит 2 (C - Conforming) в байте прав доступа AR дескриптора сегментов.
На подчиненные сегменты накладываются следующие ограничения:
1. Подчиненные сегменты не должны использовать привилегированные команды.
2. "Подчиненная" процедура должна иметь достаточные привилегии для обращения к своему параметру и возвращения результата.
3. Значение уровня привилегий дескриптора подчиненного кода должно быть меньше или равно текущему значению уровня привилегий программы. Это значит, что подчиненный код должен иметь большее или хотя бы равные привилегии, чем уровень привилегий сегмента вызывающей программы.
4. В подчиненных сегментах не разрешается передавать управление другим подчиненным сегментам.
Подчиненные сегменты кода широко используются при создании разделяемых библиотек.
E.4.2.2. Шлюзы вызова.
Шлюзы вызова применяются для фактического изменения уровней привилегий. Другое название шлюза – "вентиль".
Как системный объект, шлюз вызова имеет собственный дескриптор. В нем указан полный указатель – селектор:смещение – на точку входа в ту процедуру, которой шлюз передает управление. Сегмент кода или данных, к которому обращается программа через шлюз, не может быть изменен этой программой.
Правила пользования шлюзами:
1. Шлюз может передавать управление на сегмент кода, имеющий больший уровень привилегий, чем уровень привилегий самого дескриптора шлюза.
2. Программа может обращаться к шлюзу, имеющий тот же или более высокий уровень привилегий, чем уровень привилегий вызывающей программы.
Вообще при обращении через шлюз происходит генерация сегмента состояния задачи, после чего происходит переключение (вызов) на новую задачу как на новый процесс! Поэтому использование шлюза является более сложным способом вызова подпрограммы с другим уровнем привилегий. Подробнее об использовании шлюзов смотри [В.Л. Григорьев.].
Дата добавления: 2016-02-20; просмотров: 2026;