7.2.3. Особенности процессора 80386
32-разрядный процессор i80386 открыл новый этап
в истории микропроцессоров Intel и
персональных компьютеров типа IBM PC.
Естественно, он сохранял полную
совместимость со своими 16-разрядными
предшественниками, чтобы не отказываться
от разработанного для них программного
обеспечения. Но именно в 80386 преодолено
жесткое ограничение на длину непрерывного
сегмента памяти в 64 Кбайт, что являлось
пережитком прошлого и следствием не самых
удачных архитектурных решений 8086.
В защищенном режиме 80386 длина сегмента
может достигать 4 Гбайт, то есть всего
объема физически адресуемой памяти. Таким
образом, память фактически стала
непрерывной. Кроме того, 80386 обеспечивает
поддержку виртуальной памяти объемом до 64
Тбайт (1 Тбайт = 1024 Гбайт). Встроенный блок
управления памятью поддерживает механизмы
сегментации и страничной трансляции
адресов (Paging). Обеспечивается
четырехуровневая система защиты памяти и
ввода/вывода, а также переключение задач.
Процессор 80386, как и 80286, может работать в
двух режимах:
- Реальный режим, который полностью
совместим с 8086.
- Защищенный режим. В этом режиме возможна
адресация до 4 Гбайт физической памяти (32
разряда), через которые при использовании
механизма страничной адресации может
отображаться до 16 Тбайт виртуальной
памяти каждой задачи.
Переключение между этими двумя режимами в
обе стороны, в отличие от 80286, производится
достаточно быстро, с помощью простой
последовательности команд, и аппаратного
сброса процессора не требуется.
Процессор может оперировать с 8, 16, 32-битными
операндами, строками байт, слов и двойных
слов, а также с битами, битовыми полями и
строками бит.
В архитектуру процессора введены средства
отладки и тестирования.
Разрядность регистров данных (AX, BX, CX, DX) и
адресов (SI, DI, BP, SP) увеличена до 32. При этом в
их обозначении появилась приставка E (Extended
— расширенный), например, EAX, ESI. Отсутствие
приставки в имени означает ссылку на
младшие 16 разрядов соответствующего
регистра. Регистры данных и адресов
объединены в группу регистров общего
назначения, которые иногда могут заменять
друг друга. Это может рассматриваться как
отход от идеологии специализации всех
регистров.
Регистры селекторов оставлены 16-разрядными,
но добавлено два новых регистра FS и GS для
задания дополнительных сегментов данных.
Также расширен до 32 разрядов регистр-указатель
(счетчик) команд EIP. 32-разрядным стал и
регистр флагов EFLAGS. Его биты, определенные
для 8086 и 80286, остались прежними, но добавлены
6 новых бит (рис. 7.6). Такой же формат
используется и в процессорах 80486 и Pentium.

Рис. 7.6. Регистр признаков EFLAGS
процессора 80386.
Регистры сегментов процессора содержат 16-битные
указатели (в реальном режиме) или селекторы
(в защищенном режиме) шести сегментов. С
каждым из шести сегментных регистров
связаны программно недоступные регистры
дескрипторов, как и в случае 80286. В
защищенном режиме в регистры дескрипторов
загружается 32-битный базовый адрес
сегмента, 32-битный лимит и атрибуты
сегментов.
Помимо упомянутых регистров в состав
процессора входят еще четыре управляющих
регистра (CR0, CR1, CR2, CR3), которые хранят
признаки состояния процессора, общие для
всех задач. В процессоре Pentium к ним добавлен
еще и регистр CR4. Кроме того, процессор
содержит еще системные адресные регистры
для ссылок на сегменты и таблицы в
защищенном режиме, регистры отладки и
регистры тестирования. Как видим, от модели
к модели количество регистров процессора
постоянно возрастает.
Процессор позволяет выделять в памяти
сегменты и страницы. Сегменты в реальном
режиме имеют фиксированный размер, в
защищенном — переменный. Страницы, которых
не было в предыдущих моделях, представляют
собой области логической памяти размером 4
Кбайт, каждая из которых может отображаться
на любую область физической памяти. Если
сегменты используются на прикладном уровне,
то страницы применяются на системном.
Применительно к памяти различают три
адресных пространства: логическое,
линейное и физическое. О принципах
адресации памяти у процессора 80386 уже
говорилось в разделе 3.1.2 (см. рис. 3.8).
Процессор 80386 может использовать режимы 32-битной
или 16-битной адресации. Режим 16-битной
адресации соответствует режимам
процессоров 8086 и 80286, при этом в качестве
компонентов адреса используются младшие 16
бит соответствующих регистров. Отличие 32-битной
адресации отражено в табл. 7.1.
Табл. 7.1. Различия режимов
адресации 80386.
Компонент адресация |
16-битная адресация |
32-битная |
Базовый регистр |
BX или BP |
Любой 32-битный общего назначения |
Индексный регистр |
SI или DI |
Любой 32-битный общего назначения, кроме ESP |
Масштаб |
Нет (всегда 1) |
1,2, 4 или 8 |
Смещение |
0, 8 или 16 бит |
0, 8 или 32 бита |
Так же, как и предшественники, процессор 80386
обрабатывает все виды прерывания:
аппаратные (маскируемые и немаскируемые) и
программные, которые в данном случае
обрабатываются как разновидность
исключений, и собственно исключения.
Исключения подразделяются на отказы,
ловушки и аварийные завершения.
- Отказ (Fault) — это исключение, которое
обнаруживается и обслуживается до
выполнения команды, вызывающей ошибку.
- Ловушка (Trap) — это исключение,
которое обнаруживается и обслуживается
после выполнения команды, вызывающей это
исключение. К классу ловушек относятся и
программные прерывания.
- Аварийное завершение (Abort) — это
исключение, которое не позволяет точно
установить команду, вызвавшую его. Оно
используется для сообщения о серьезной
ошибке, такой как аппаратная ошибка или
повреждение системных таблиц.
Каждому номеру прерывания (0…255) или
исключения соответствует элемент в таблице
дескрипторов прерываний IDT (Interrupt Descriptor Table).
В защищенном режиме IDT может иметь размер от
32 до 256 дескрипторов, каждый из которых
состоит из 8 байт.
Отличия от предшествующего процессора 80286 в
выполнении операций ввода/вывода сводятся
к добавлению возможностей обращения к 32-битным
портам. Важно отметить, что строковые
команды процессора 80386 обеспечивают
блочный ввод/вывод с большей скоростью, чем
стандартный контроллер прямого доступа к
памяти.
Процессор выпускался в 100-выводном корпусе.
Была предусмотрена возможность
подключения внешнего сопроцессора 80387.
А теперь остановимся чуть подробнее на
защищенном режиме, который используется на
полную мощность именно начиная с 32-разрядных
процессоров, так как процессор 80286 имел
существенные ограничения и в большинстве
случаев работал все-таки в реальном режиме.
Защищенный режим был предложен для
обеспечения независимости одновременного
выполнения нескольких задач (как системных,
так и прикладных). Для этого предусмотрена
защита ресурсов каждой задачи от действий
других задач. Под ресурсами здесь
понимается память с данными, программами,
системными таблицами, а также используемая
задачей аппаратура. Защита основывается на
сегментации памяти, причем, в отличие от
реального режима, задача не может
переопределять положения своих сегментов в
памяти и использует только сегменты,
определенные для нее операционной системой.
Сегмент определяется дескриптором
сегмента, который задает положение
сегмента в памяти, его размер (или лимит),
назначение и характеристики защиты.
Защита с помощью сегментации не позволяет:
- использовать сегменты не по назначению,
например, трактовать область данных как
область программы;
- нарушать права доступа (например,
пытаться записывать информацию в сегмент,
предназначенный только для чтения, или
обращаться к сегменту, не имея достаточных
привилегий);
- адресоваться к элементам, выходящим за
границу сегмента;
- изменять дескрипторы сегментов, не имея
достаточных привилегий.
Защищенный режим предусматривает средства
переключения задач. Состояние каждой
задачи (то есть состояние всех регистров
процессора) хранится в специальном
сегменте состояния задачи, на который
указывает селектор в регистре задачи. При
переключении задачи достаточно загрузить в
регистр задачи новый селектор, и состояние
предыдущей задачи автоматически
сохранится, а в процессор загрузится
состояние новой (или ранее прерванной)
задачи. Это развитие идеи стека.
В защищенном режиме предусматривается
иерархическая четырехуровневая (уровни 0, 1,
2, 3) система привилегий, предназначенная для
управления выполнением привилегированных
команд и доступом к дескрипторам (рис. 7.7).
Уровень 0 соответствует неограниченным
правам доступа и отводится ядру
операционной системы. Уровень 3 дает
минимальные права и отводится прикладным
задачам. Уровни привилегий относятся к
дескрипторам, селекторам и задачам. Кроме
того, в регистре флагов имеется двухбитовое
поле привилегий ввода/вывода (см. рис. 7.4 и
7.6), управляющее доступом к командам ввода/вывода
и флагом прерываний.
Механизм виртуальной памяти, используемый
в защищенном режиме, позволяет любой задаче
использовать логическое пространство
размером до 64 Тбайт (16К сегментов по 4 Гбайта).
Для этого каждый сегмент в своем
дескрипторе имеет специальный бит,
указывающий на присутствие данного
сегмента в оперативной памяти в текущий
момент. Неиспользуемый сегмент может быть
выгружен из оперативной памяти во внешнюю
память (обычно — на диск), о чем делается
пометка в его дескрипторе. На
освободившееся место из внешней памяти
может закачиваться другой сегмент (это
называется свопингом или подкачкой). При
обращении задачи к отсутствующему в
оперативной памяти сегменту
вырабатывается специальное исключение,
которое и выполняет свопинг. С точки зрения
выполняемой программы, виртуальная память
ничем не отличается от реальной (говорят,
что виртуальная память прозрачна), не
считая задержки на процесс перекачки
информации на диск и с диска.

Рис. 7.7. Уровни привилегий 32-разрядных
процессоров.
Реальное использование системы защиты и
виртуальной памяти возлагается на
операционную систему, которая в идеале
должна обеспечивать работоспособность
даже в случае некорректного выполнения
прикладных задач.
В памяти существует три типа таблиц
дескрипторов: локальная таблица
дескрипторов LDT, глобальная таблица
дескрипторов GDT и таблица дескрипторов
прерываний IDT. Каждой таблице соответствует
свой регистр процессора (соответственно, LDTR,
GDTR и IDTR), где хранятся дескрипторы сегментов.
Глобальная таблица содержит дескрипторы,
доступные всем задачам, а локальная может
быть для каждой задачи своя. Дескрипторы
состоят из 8 байтов (как и у 80286). Однако
назначение байтов различно. Для примера на
рис. 7.8 показаны форматы дескрипторов
сегмента программ и данных процессоров 80286
и 80386.

Рис. 7.8. Дескрипторы сегментов
программы и данных.
Существуют также системные сегменты,
предназначенные для хранения локальных
таблиц дескрипторов и таблиц состояния
задач. Их дескрипторы (тоже 8-байтные)
определяют базовый адрес, лимит сегмента,
права доступа (чтение, чтение/запись, только
исполнение или исполнение/чтение) и
присутствие сегмента в оперативной памяти.
Задачи, дескрипторы и селекторы имеют свои
уровни привилегий. Привилегии задач
действуют на выполнение команд и
использование дескрипторов. Текущий
уровень привилегии задач определяется
двумя младшими битами регистра CS.
Привилегии дескриптора описываются полем
DPL (рис. 7.8). DPL определяет наименьший уровень
привилегий, с которым возможен доступ к
данному дескриптору. Привилегии селектора
задаются полем RPL (см. рис. 7.5). Привилегии
проверяются при попытках записи в
сегментные регистры, а также при выполнении
некоторых команд.
Таким образом, начиная с процессора 80386,
появляются средства обслуживания
многозадачного режима. Естественно,
процессор не может обрабатывать несколько
задач одновременно, выполняя по несколько
команд сразу. Он только периодически
переключается между задачами. Но с точки
зрения пользователя получается, что
компьютер параллельно работает с
несколькими задачами.
|