Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 7

P   DPL   0   0/1  1  1   1        Шлюз  ловушки  80286/80386

 


здесь обозначение 80286/80386 практически означает 16-/32-битовые   процессоры, в том числе 80486 и Pentium.

 


P   DPL   1    1   C   R  A        Байт доступа  дескриптора кодового сегмента

P   DPL   1   0   ED  W A        Байт доступа дескриптора сегмента данных

 

Назначение бита b3 зависит от типа дескриптора - является он системным или нет.

В системных дескрипторах в большинстве случаев бит b3 определяет тип используемого процессора 80х86. Если вызываемая программа написана для 16-разрядного процессора 80286, b3 = 0, если для 32-разрядного, b3 = 1. Этот бит определяет механизм формирования физического адреса операнда в памяти, который зависит от типа процессора. (32-разрядные процессоры х86 могут использовать страничную адресацию памяти, при которой формирование физического адреса выполняется способом, отличным от 16-разрядного процессора 80286).

В несистемных дескрипторах бит b3 имеет собственное название и обозначение - бит выполняемости Е (Executable).  Значение Е = 1 определяет кодовый сегмент, а значение Е = 0 указывает на сегмент данных.

Оставшиеся три бита (поле TYPE) доопределяют тип дескриптора. Назначение  и кодирование различных типов системных дескрипторов представлено в таблице.

Разделение сегментов на типы позволяет защититься от случайного или преднамеренного использования сегментов не по назначению.

Сегменты кода и данных - это структуры памяти с байтовой организацией. Процессор обменивается с памятью n-байтными словами (2-байтными - 80286, 4-байтными - i386, i486, 8-байтными - Pentium) из которых он в соответствии с выполняемой командой выбирает операнды требуемого формата.

Дескрипторы сегментов кода и данных в поле TYPE содержат бит  обращения А (бит 0), который совместно с битом присутствия Р  помогает операционной системе реализовать виртуальную память, и по два дополнительных бита-признака, ограничивающих выполнение некоторых операций с операндами этих сегментов. 

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

Кодовый сегмент.

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

Поле TYPE дескриптора кодового сегмента дополнительно кодирует бит разрешения чтения R (Readable) и бит подчинения С(Conforming). Назначение указанных битов-признаков следующее.

Сегмент кода может содержать константы, в частности, таблицы, которые могут использоваться (считываться) программой при ее выполнении. Разрешение чтения данных из кодового сегмента кодируется битом R (бит 1) байта доступа. Если R = 1, то такой сегмент можно не только выполнять, но и, используя префикс замены сегмента, считывать из него данные. Если R = 0, любая  попытка считать данные из кодового сегмента вызывает особый случай защиты. Заметим, что из считываемого сегмента можно считать данные только программой, имеющей такой же или более привилегированный уровень, что и  считываемый сегмент.

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

Передачи управления в защищенном режиме

Передача управления в защищенном режиме  осуществляется командами CALL, JMP, INT, RET и IRET, а также механизмами исключений и прерываний.