Лекция: Максимальный режим работы ЦП.

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

— уровень 0 ядро ОС

— уровень 1 драйверы ОС

— уровень 2 интерфейс ОС

— уровень 3прикладные программы

Сам по себе уровень привилегий еще ничего не значит, его нельзя установить в процессоре. Уровень привилегий применяется как одно из свойств, при описании различных объектов, например, программного сегмента, и действует только при работе с этим объектом. Первое, с чем сталкивается программа при переходе в защищенный режим – это другая система адресации памяти. Если в режиме реальных адресов для обращения к памяти используется пара 16-разрядных объектов, то есть сегментный регистр при смещении, то адресация памяти в запрещенном режиме также производится через сегмент и смещение в сегменте для чего используется пара регистров, но для описания сегмента используется больше информации, а именно:

— 32-разрядный адрес

— 20-разрядный предел сегмента(предел на единицу ниже разряда)

— номер уровня привилегии сегмента

— тип сегмента (программный, стек, данные и т.п.)

— системный объект

Кроме того могут присутствовать дополнительные свойства.

Для того, чтобы хранить эту информацию, используется специальная область памяти. Сегмент по-прежнему указывается в сегментном регистре, но теперь в нем хранится номер сегмента из списка определенных сегментов. Этот номер называется селектор.

В качестве смещения используется 16 или 32-разрядный регистр. При обращении к памяти процессор проверяет возможность доступа к сегменту по уровню привилегий. Проверяет не превысил ли адрес предел сегмента и можно ли обращаться к этому сегменту в данном случае. Например, может быть запрещена передача управления в сегмент, описывающий данные или стек. Если в результате проверки будет обнаружено нарушение какого-либо условия, то процессор сгенерирует исключение и тем самым обеспечит защиту. Предел сегмента – это максимально допустимое смещение внутри него. Предел сегмента определяет его размеры. Поскольку значение предела – 20-разрядная величина, то это означает, что максимальное значение предела равно 2^20-1. Процессор измеряет размер сегмента либо байтами либо страницами. Страница – это блок памяти размером 4Кб. В описании сегмента можно показать в каких единицах измеряется сегмент и соответственно можно получить два типа сегментов с максимальными размерами – 1Мб (2^20 байт) или 4Гб (2^20 страниц). Эта способность измерять сегмент либо байтами либо страницами называется гранулярность. Значение предела сегмента может быть любым от нуля до 2^20-1. Гранулярность устанавливается по усмотрению программиста и может быть либо байтная либо страничная. Все это позволяет определять сегменты любого размера от 0 байт до 4 гигабайт.

Сегмент определяется в виде структуры данных, которая называется дескриптор. Размер дескриптора 8 байт. Все дескрипторы хранятся последовательно в специально отведенной области памяти в Глобальной Дескрипторной Таблице.

 

 

Значения предела и адреса сегмента разбросаны по все структуре дескриптора по причине того, что впервые защищенный режим появился в 16-разрядном процессоре Intel80286. Для совместимости с ним дескрипторы не переделали, а расширили дополнительными полями, то есть биты 68-43. В программах дескриптор удобнее использовать в следующем виде:

 

Descriotor:

dwlimit_lowмладшеесловопредела

dwaddress_lowмладшеесловоадреса

dbaddressht 3-йбитадреса

dbaddressrightsправодоступа

dblimit_hi_and_flags старшая часть предела

dbaddress_hi 4-йбитадреса

 

Байт прав доступа 40-47 имеет следующий формат:

40: А – бит доступа Accesseed

41-43 тип сегмента

44:S бит системного сегмента

45-46: DPL –уровень привилегий

47:P бит присутствия смещения

 

Тетрада флагов (52-55 G, D, X, C) имеет формат:

52 бит U — пользователь User

53 бит X — зарегистрирован

54 бит D – размерность операндов (DefaultSize)

55 бит G – бит гранулярности (Granularity)

 

При адресации памяти в защищенном режиме команды ссылаются на сегменты, указывая не их адреса, а описания сегментов, то есть дескрипторы. Адресация производится через пару регистров – сегментов смещения. В качестве системных регистров используются: CS, DS, ES, SS но у них указывается не адрес сегмента, а селектор дескриптора. Селекторы нужны по крайней мере по 3 причинам:

— описание сегмента занимает 8 байт, а использовать 8-байтные сегментные регистры не эффективно.

— селекторы имеют размер 16 бит, благодаря чему их можно использовать в сегментных регистрах и соответственно обращаться к памяти можно по-прежнему через пару регистров.

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

 

Адрес можно указывать не только через пару регистров, но и в переменную через пару значений селектор-смещение.

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

 

TI (TableIndicator) – определяет таблицу, из которой выбирается нужный дескриптор, если TI=0 то обращение производится к GDT. Если TI=1 – то к текущей локальной дескрипторной таблице LDT.

 

Index – номер дескриптора. Соответственно от 0 до 8191.

 

Число дескрипторов можно увеличивать за счет использования дополнительных LDT. Обращение к дескрипторной таблице процессор производит только в момент загрузки в сегментный регистр нового селектора. После этого содержимое дескриптора копируется в теневой регистр, к которому имеет доступ только сам процессор. Любое последующее обращение к сегменту будет происходить с помощью теневого регистра, без обращения к дескрипторной таблице. То есть не потребуются лишние такты на чтение памяти.

 

При загрузке недопустимого значения в селектор, процессор будет генерировать исключения, даже если нет обращения через него к памяти. В защищенном режиме работа прерываний происходит следующим образом. Во-первых, вводится новый класс прерываний генерируемых самим процессором при нарушениях условий защиты, так называемые исключения. Число возможных векторов прерываний по-прежнему равно 256, 32 из них от 00h до 1Fh используются исключениями. Во-вторых, вместо дальних адресов в таблице прерываний используются дескрипторы специальных системных объектов, так называемых шлюзов. В-третьих, сама таблица прерываний, которая называется IDT (InterruptDescriptorsTable), может находиться по любому адресу памяти. Все эти особенности появились в процессоре Intel80386 и с небольшими дополнениями используются во всех 32-разрядных процессорах. Исключения – основа защищенного режима. Благодаря исключениям процессор автоматически реагирует на любые попытки нарушить защиту системы и позволяет их корректно обработать. Благодаря разделению кода и данных по уровням привилегий, обработчики прерываний можно надежно изолировать от других программ.

 

еще рефераты
Еще работы по информатике