Жмакин А.П. Архитектура ЭВМ (2006) (1186252), страница 28
Текст из файла (страница 28)
Так как TLB хранит адреса 32 страниц по 4 Кбайт, то непосредственно доступными становятся физические адреса 128 Кбайт памяти.
7.1.3. Защита памяти
В х86 предусмотрены два вида защиты памяти: на уровне сегментов и на уровне страниц.
Защита памяти на уровне сегментов
В *86 определено понятие привилегии для сегмента и установлены 4 уровня привилегий PL (рис. 7.7), которые задаются номерами от 0 (наиболее защищенный) до 3 (низший).
В ядро входит часть ОС, обеспечивающая инициализацию работы, управление доступом к памяти, защиту и ряд других жизненно важных функций, нарушение которых полностью выводит из строя МПС. Основная часть ОС должна иметь уровень 1. К уровню 2 обычно относят ряд служебных программ ОС, например, драйверы внешних устройств, системы управления базами данных, специализированные подсистемы программирования и др.
Выше отмечалось, что основой организации памяти *86 является сегмент. С каждым сегментом (данных, кода или стека) ассоциируется уровень привилегий DPL и все, что находится внутри этого сегмента, имеет данный уровень привилегий. DPL располагается в байте доступа дескриптора сегмента, поэтому его называют уровнем привилегий дескриптора (Descriptor Privilege Level), однако правильнее считать его уровнем привилегий сегмента.
Уровень привилегий выполняющегося кода называется текущим уровнем привилегий CPL (Current Privilege Level или Code Privilege Level) и он задается полем RPL селектора в сегментном регистре CS. Значение CPL можно считать уровнем привилегий процессора в текущий момент времени, т. к. при передаче управления сегменту кода с другим уровнем привилегий процессор будет работать на новом уровне привилегий.
Каждый селектор выбирает точно один дескриптор и, соответственно, один сегмент, но конкретный сегмент могут идентифицировать несколько селекторов ("альтернативное именование"). Младшие два бита селектора содержат поле запрашиваемого уровня привилегий RPL (Requested Privilege Level). Это поле не влияет на выбор дескриптора, но учитывается при контроле привилегий.
Таким образом, текущее состояние системы защиты характеризуется следующими признаками:
Е CPL — уровень привилегий выполняемого кода, размещается в поле RPL сегментного регистра кода CS;
О DPL — уровни привилегий для каждого из восьми открытых сегментов, располагаются в байте доступа дескрипторов, помещенных в "теневые регистры";
О RPL — определяют уровни привилегий источника селектора, размещаются в полях RPL сегментных регистров.
Процессор постоянно контролирует, обладает ли текущая программа достаточным уровнем привилегий, чтобы:
□ выполнять некоторые команды;
□ обращаться к данным других программ;
□ передавать управление внешнему (по отношению к программе) ко командами передачи управления типа FAR.
В системе команд существуют специальные привилегированные команды, которые могут выполняться процессором, работающим только на уровне привилегий 0. При попытке выполнить их на другом уровне привилегий генерируется прерывание 13 — нарушение общей защиты.
К привилегированным относятся команды:
□ останов процессора;
□ сброс флага переключенной задачи;
□ загрузка регистров дескрипторных таблиц;
□ загрузка регистра задачи;
□ загрузка слова состояния машины;
□ модификация флага прерываний IF*;
□ команды ввода/вывода*.
Последние две группы команд (отмеченные *) не обязательно выполняются на нулевом уровне, достаточно, чтобы уровень привилегий программы был выше уровня привилегий ввода/вывода, определяемого полем IOPL в регистре EFLAGS.
Защита доступа к данным
Данные из сегмента могут выбираться только программой, имеющей такой же или более высокий, чем сегмент, уровень привилегий. Программам не разрешается обращение к данным, которые имеют более высокий уровень привилегий, чем выполняемая программа. Программы могут использовать данные на своем и более низких уровнях привилегий. Ограничения на возможность доступа к данным иллюстрирует рис. 7.8.
Контроль реализуется двумя способами. Во-первых, проверка привилегий осуществляется при загрузке селектора в один из сегментных регистров данных — DS, ES, FS или GS. Если значение DPL того сегмента, который выбирает селектор, численно меньше CPL, процессор не загружает селектор и формирует нарушение общей защиты. Во-вторых, после успешной загрузки селектора при использовании его для фактического обращения к памяти процессор контролирует, разрешена ли для этого сегмента запрашиваемая операция (чтение или запись). Кроме того, при обращении контролируется значение запрашиваемого уровня привилегий RPL, причем обращение разрешается, если DPL > max(RPL, CPL), иначе формируется прерывание 13.
Обращение к сегменту стека возможно, если RPL = DPL = CPL, причем сегмент стека должен иметь разрешение на запись— бит W в байте доступа должен быть установлен.
Защита сегментов кода
Межсегментная передача управления происходит по командам jnp, call, ret, int, iret. Для передачи управления существуют жесткие ограничения: передавать управление в общем случае можно только в пределах своего уровня привилегий, т. е. DPL целевого дескриптора должен быть точно равен CPL (см. рис. 7.8).
Однако часто бывает необходимо обойти установленные ограничения (например, фрагменты операционной системы могут использоваться программами пользователя). В дс86 предусмотрены два механизма передачи управления между уровнями привилегий: подчиненные сегменты и шлюзы вызова.
Если сегмент кода определен как подчиненный (установлен в 1 бит подчиненности С в байте доступа дескриптора), то для него вводятся другие правила защиты. С подчиненными сегментами не ассоциируется конкретный уровень привилегий, он устанавливается равным уровню привилегий вызывающей программы. Поэтому код подчиненных сегментов не должен содержать привилегированных команд.
Когда управление передается подчиненному сегменту, биты поля RPL регистра CS не изменяются на значение поля DPL дескриптора нового сегмента кода, а сохраняют прежнее значение. Только в этой единственной ситуации биты поля RPL регистра CS не соответствуют битам поля DPL дескриптора текущего выполняемого сегмента кода.
При использовании подчиненных сегментов сохраняется одно ограничение— значение DPL дескриптора подчиненного сегмента всегда должно быть меньше или равно текущему значению CPL. Другими словами, передача управления подчиненному сегменту разрешается только во внутренние, более защищенные сегменты. Если бы это ограничение нарушалось, то возврат в вызывающую программу был бы вызовом неподчиненного более защищенного сегмента, что никогда не разрешено.
Наличие подчиненных сегментов кода обеспечивает некоторую свободу передачи управления между уровнями привилегий. Для реализации фактического изменения уровня привилегий привлекаются особые системные объекты, называемые шлюзами вызова (рис. 7.9).
Хотя шлюзы вызова и располагаются в дескрипторной таблице, они, по существу, дескрипторами не являются, т. к. не определяют никакого сегмента. Поэтому в дескрипторе шлюза отсутствует база и граница сегмента, а содержится лишь селектор вызываемого сегмента программы и относительный адрес шлюза — задается фактически адрес селектор: смещение точки входа той процедуры (назначения), которой шлюз передает управление. Байт доступа имеет тот же смысл, что и в обычных дескрипторах, а пятибитовое поле WC указывает количество параметров, переносимых из стека текущей программы в стек новой программы.
При этом, если вызываемая программа имеет более высокий уровень привилегий, чем текущая, то для нее по команде call создается новый стек, позиция которого определяется из сегмента состояния задачи TSS. В этот стек последовательно записываются: старые значения SS и ESP, параметры, переносимые из старого стека, старые CS и EIP. По команде ret происходит возврат к старому стеку.
Дескриптор шлюза вызова действует как своеобразный интерфейс между сегментами кода на разных уровнях привилегий. Шлюзы вызова идентифицируют разрешенные точки входа в более привилегированные программы, которым может быть передано управление.
Селектор, определяющий шлюз вызова, можно загружать только в сегментный регистр CS для передачи управления сегменту кода на другом уровне привилегий.
Защита памяти на уровне страниц
В отличие от 80386, процессоры 80486 и Pentium имеют дополнительные поля в элементе страничной таблицы [3]. Формат строки СТ i80486 представлен на рис. 7.10, сравните его с форматом на рис. 7.6.
Кроме используемых в i80386 полей:
□ Р — бит присутствия; П R/W — чтение/запись;
□ U/S — пользователь/супервизор;
□ А — бит доступа;
□ D — признак записи на страницу;
□ резерв ОС
введены биты управления кэшированием:
□ PCD — запрет кэширования страницы;
□ PWT — сквозная запись.
На уровне страниц в 80486 предусмотрены две разновидности контроля:
□ ограничение адресуемой области;
□ контроль типа.
Ограничение адресуемой области. Для страниц и сегментов привилегии интерпретируются по-разному: для сегментов— 4 уровня, для страниц — только 2, определяемые битом U/S. При U/S = 0 страница имеет уровень супервизора, иначе — уровень пользователя. На уровне супервизора работают обычно операционные системы, драйверы ВУ, а также располагаются защищенные данные (например, страничные таблицы). Уровни привилегий сегментов отображаются на уровень привилегий страниц: если значение CPL равно 0, 1 или 2, то процессор работает на уровне супервизора, при CPL = 3 — на уровне пользователя. На уровне супервизора доступны все страницы, а на уровне пользователя — только страницы уровня пользователя.
Контроль типа. Механизм защиты распознает только два типа страниц: с доступом только по считыванию (R/W = 0) и с доступом по считыванию/записи (R/W = 1), причем в 80386 ограничение по записи действительно только для уровня пользователя. Программа уровня супервизора игнорирует значение бита R/W и может записывать на любые страницы. В отличие от 80386, процессор 80486 разрешает защитить от записи страницы уровня пользователя в режиме супервизора: установка в регистре CR0 бита WR = 1 обеспечивает чувствительность режима супервизора к защищенным от записи страницам режима пользователя.
Для любой страницы атрибуты защиты ее элемента каталога разделов могут отличаться от атрибутов защиты ее элемента страничной таблицы. Процессор контролирует атрибуты защиты в таблицах обоих уровней и принимает решение таким образом, что всякое разночтение в уровне привилегий раздела и страницы всегда разрешается в сторону большей защиты (предоставления меньших прав пользователю).
7.2. Мультизадачность
Под мультизадачностью понимают способность процессора выполнять несколько задач "одновременно". Конечно, процессор традиционной архитектуры не может выполнять строго одновременно более одного потока команд, однако он может некоторое время выполнять один поток команд, потом быстро переключиться на выполнение другого потока команд, потом третьего, потом — снова первого и т. д. Такая организация вычислительных процессов при высоком быстродействии процессора создает иллюзию одновременности (параллельности) выполнения нескольких задач.
Для реализации мультизадачности необходимо:
□ располагать быстродействующим процессором;
□ процессор должен аппаратно поддерживать механизм быстрого переключения задач;
□ процессор должен аппаратно поддерживать механизм защиты памяти;
□ использовать специальную мультипрограммную операционную систему.
Под задачей в мультизадачной системе понимается программа, которая выполняется или ожидает выполнения, пока выполняется другая задача, причем в определение задачи обычно включают ресурсы, требуемые для ее решения (объем памяти, процессорное время, дисковое пространство и др.).