5. Защита    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

5.1. Контроль предела и выравнивания

Контроль предела

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

Формат дескриптора

В проверке контроля предела участвуют следующие биты из дескриптора сегмента:

Когда бит гранулярности G сброшен, предел задается 20-битным значением в байтах и варьируется от 00000 до FFFFFh (1Мбайт). Когда бит гранулярности G установлен, процессор сдвигает 20-битное значение предела на 12 бит влево. В этом случае предел сегмента задается в 4Кбайтных страницах и варьируется от FFFh (предел равен 0) до FFFFFFFFh (предел равен FFFFFh). Именно в этом случае размер сегмента может достигать 4Гбайт. Когда выставлен бит гранулярности, процессор не подвергает контролю младшие 12 бит линейного адреса. Например, при пределе 0 смещения 00000000-00000FFFh не вызывают исключения.

Для всех типов сегментов, кроме сегментов данных, расширяемых вниз (E=1), предел - это максимальное смещение в сегменте, по которому допустимо чтение одного байта. Т.е. значение предела на 1 меньше размера сегмента. Нарушение общей защиты возникнет, если программа попытается прочитать:

В сегментах данных, расширяемых вниз, (обычно это сегменты стека) значение предела играет противоположную роль. Значение предела соответствует минимальному смещению, обращение по которому вызывает исключение. Таким образом, для 16-битных сегментов (D=0) допустимым диапазоном адресов является "предел+1" ... FFFFh, а для 32-битных сегментов (D=1) - "предел+1" ... FFFFFFFFh. Для таких сегментов размер максимален, когда предел равен 0.

Контроль предела позволяет легко выявить ошибки "убегания" кода, выхода за пределы массива, неверного вычисления указателей.

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

Контроль выравнивания

Возможность контроля выравнивания впервые появилась в МП Intel486. Контроль выравнивания применим только к ссылкам на сегменты данных (или стека). Контроль выравнивания заключается в следующих проверках:

Процессор подвергает указатель контролю выравнивания только в том случае, если текущий уровень привилегий CPL=3, управляющий бит CR0.AM=1 и флаг EFLAGS.AC=1. Бит CR0.AM выставляется операционной системой в зависимости от того, поддерживает ли она такой вид контроля. Бит EFLAGS.AC выставляется прикладной задачей в зависимости от того, требуется ли ей такой вид контроля. При нарушении контроля выравнивания генерируется исключение #17.