CPU (664422), страница 4
Текст из файла (страница 4)
В реальном режиме по адресации памяти обеспечивается совместимость с процессором 8086, который своей 16-битной адресной шиной охватывает пространство физической памяти в 1Мб. Для обеспечения совместимости с 80286 32-разрядные процессоры реализуют его ошибку, связанную с переполнением, возникающим при сложении адресов сегмента с эффективным адресом. При вычисление физического адреса возможно возникновение переполнение, которое вызовет появление единицы на линии А20 шины адреса. Максимальное значение адреса в реальном режиме 10FFEF достигается при Seg=FFFFh и EA=FFFFh. Для обеспечения полной программной совместимости с 8086 в РС используется вентиль Gate A20, принудительно обнуляющий бит А20 системной шины адреса. Вентиль в РС управляется через программно-управляемый бит контроля клавиатуры 8042 или более быстрым способом (Gate A 20 Fast Control), определяемым чипсетом системной платы.
В реальном режиме размер сегмента фиксирован – как и 8086, он составляет 64 Кб (FFFFh). Попытка использования эффективного адреса, выходящего за границы сегмента, при 32-битной адресации вызывает исключение типа 13. При 16-битной адресации при вычисление эффективного адреса возможный перенос в разряд А16 игнорируется, и сегмент “сворачивается кольцом” (как и в 8086). Средства контроля следят и за переходом через границу сегмента во время обращения по “приграничному” адресу. При попытки адресации к слову, имеющему смещение FFFFh, или двойному слову со смещением FFFDh-FFFh (их старшие байты выходят за границу сегмента), или выполнения инструкции, все байты которой не умещаются в данном сегменте, процессор вырабатывает прерывание – исключение типа 13 (0Dh) – Segment Overrun Exception. При попытки выполнения инструкции ESCAPE с операндом памяти, не умещающимся в сегменте, вырабатывается исключение типа 9 – Processor Extension Segment Overrun Interrupt (только для 386).
8Система команд 32-разрядных процессоров предусматривает 11 режимов адресации операндов. Из них только два не имеют отношение к памяти:
-
операнд-регистр, который может находится в любом 8, 16 или 32-битном регистре процессора.;
-
непосредственный операнд (8, 16 или 32-бит), который может содержаться в самой команде.
Остальные девять режимов (табл. 3.1.) используются при формировании эффективного адреса операнда из памяти.
Эффективный адрес вычисляется с использованием комбинации следующих компонентов:
Смещение (Displacement или Disp) – 8-, 16- или 32-битное число, включенное в команду.
База (Base) – содержимое базового регистра. Обычно используется для указания на начало некоторого массива.
Индекс (Index) – содержимое индексного регистра. Обычно используется для выбора элемента массива.
Масштаб (Scale) – множитель (1, 2, 4 или 8), указанный в коде инструкции. Этот элемент используется для указания размера элемента массива. Доступен только в 32-битном режиме адресации.
Эффективный адрес вычисляется по формуле EA=Base+Index*Scale+Disp.
Отдельные слагаемые в этой формуле могут и отсутствовать. Возможные режимы адресации приведены в табл. 3.1.
Таблица 3.1. Режимы адресации памяти 32-битных процессоров
Прямая адресация | EA=Disp |
Косвенная регистровая адресная Register Index Mode | EA=Base |
Базовая адресации Based Mode | EA=Base+Disp |
Индексная адресация Index Mode | EA=Index+Disp |
Масштабированная индексная адресации Scaled Index Mode | EA=Scalex*Index+Disp* |
Базово-индексная адресация Based Index Mode | EA=Base+Index* |
Масштабированная базово-индексная адресация Based Scaled Index Mode | EA=Base+Scale* Index |
Масштабированная базово-индексная адресация Based Index Mode with Displacement | EA=Base+Index+Disp |
Масштабированная базово-индексная адресации со смещение Based Scaled Index with Displacement | EA=Base+Scale*Index+Disp* |
Процессор может использовать режимы 32-битной или 16-битной адресации. Режим 16-битной адресации соответствует режимам процессоров 8086 и 80286, при этом в качестве компонентов адреса используются младшие 16 бит соответствующих регистров. Режим 32-битной адресации использует расширенные 32-разрядные регистры и имеет дополнительные режимы, использующие масштабирование индекса. Различия 16- и 32-битных режимов адресации приведены в табл. 3.2.
В реальном режиме по умолчанию используется 16-битная адресация, но с помощью префикса изменение разрядн6ости адреса (Address Length Prefix) для текущей инструкции можно переключится в 32-битный режим. При этом появляются дополнительные возможности адресации (масштабирования), но вычисленное значение эффективного адреса все равно не может преодолеть 64-килобайтный барьер – при такой попытке генерируется исключение 13 – General Protection Fault.
В защищенном режиме адресация по умолчанию определяется битом D дескриптора используемого кодового сегмента: при D=0 – 15 бит, при D=1 – 32 бита. Префикс разрядности адреса переключает разрядность для текущей инструкции на противоположную.
Таблица 3.2. Различия режимов адресации
Компоненты | 16-битная адресации | 32-битная адресации |
Базовый регистр | BX или BP | Любой 32-битный общего назначения |
Индексный регистр | SI или DI | Любой 32-битный общего назначение, кроме ESP |
Масштаб | Нет (всегда 1) | 1, 2, 4 или 8 |
Смещение | 0, 8 или 16 бит | 0, 8 или 32 бит |
При обращениях к памяти использование сегментных регистров по умолчанию определяется типом обращения (табл. 3.3.). На время текущей инструкции при необходимости для большинства типов обращения возможно использование альтернативного сегментного регистра, на что указывает префикс замены сегмента (CS:; DS:; ES:; SS:; FS: или GS) перед кодом инструкции.
Таблица 3.3. Использование сегментных регистров при адресации памяти
Тип обращения к памяти | Сегментный регистр | |
по умолчанию | альтернативный | |
Выборка команд | CS | Нет |
Стековые операции | SS | Нет |
Строка-приемник | ES | Нет |
Любые ссылки к памяти, кроме использующих в качестве базового регистры BP, EBP или ESP | DS | CS,ES,SS FS,GS |
Ссылки к памяти, использующие в качестве базового регистры BP, EBP или ESP | SS | CS,DS,ES, FS,GS |
2.1.2. Прерывания и исключения
Прерывания и исключения нарушают нормальный ход выполнения программы для обработки внешних событий или сообщения о возникновении особых условий или ошибок.
Прерывания подразделяются на аппаратные (маскируемые и немаскируемые), вызываемые электрическими сигналами на выходах процессора, и программные, вызываемые по команде INT xx. Программные прерывания процессором обрабатываются как разновидность исключений.
Аппаратные прерывания подразделяются на маскируемые и немаскируемые. Процессор может воспринимать прерывания после выполнения каждой команды, длинные строковые команды имеют для восприятия прерываний специальные окна.
Маскируемые прерывания вызывают переход и высокий уровень сигнала на входе INTR (Interrupt Request) при установленном флаге разрешения (IF=1). В этом случае процессор сохраняет с стеке регистр флагов, сбрасывает флаг IF и вырабатывает два следующих друг за другом (back to back) цикла подтверждения прерывания, в которых генерируются управляющие сигналы INTA# (Interrupt Acknowledge). Высокий уровень сигнала INTR должен сохраняться по крайней мере до подтверждения прерывания. Первый цикл подтверждения холостой, по второму импульсу внешний контроллер прерываний передает по шине номер вектора, обслуживающего данный тип аппаратного прерывания. Прерывание с полеченным номером вектора выполняется процессором также, как и программное. Обработка текущего прерывания может быть в свою очередь прервана немаскируемым прерыванием, а если обработчик установит флаг IF, то и другим маскируемым аппаратным прерыванием.
Немаскируемые прерывания выполняются не зависимо от состояния флага IF по сигналу NMI (Non Mascable Interrupt). Высокий уровень на этом входе вызовет прерывание с типом (вектором) 2, которое выполняется также, как и маскируемое. Его обработка не может прерваться под действием сигнала на входе NMI до выполнения команды IRET.
Исключения (Exceptions) подразделяются на отказы, ловушки и аварийные завершения.
Отказ (fault) – это исключение, которое обнаруживается и обслуживается до выполнения инструкции, вызывающей ошибку. После обнаружения этого исключения выполнение возвращается снова на туже инструкцию (включая все префиксы), которая вызвала отказ. Отказы, использующиеся в системе виртуальной памяти, позволяют, например, подкачать с диска в оперативную память затребованную страницу или сегмент.
Ловушка (trap) – это исключение, которое обнаруживается и обслуживается после выполнения инструкции, его вызывающей. После обслуживания этого исключения управление возвращается на инструкцию, следующей за вызывающей ловушку. К классу ловушек относятся и программные прерывания.
Аварийное завершение (abort) – это исключение, которое не позволяет точно установить инструкцию, его вызвавшую. Оно используется для сообщения о серьезной ошибке, такой как аппаратное ошибка или повреждение системных таблиц.
Набор и обработка исключений реального и защищенного режимов различны. Под исключения Intel резервирует векторы 0-31 в таблице прерываний, однако в РС часть из них перекрывается системными прерываниями BIOS и DOS.
2.1.3. Начальный сброс и самотестирование
По высокому уровню сигнала на входе RESET процессор прекращает выполнение инструкции и перестает управлять локальной шиной. После аппаратного сброса процессор переходит к выполнению команды, считанной по физическому адресу FFFFFFF0h. Сброс переводит процессор в реальный режим и устанавливает значения некоторых регистров:
FLAGS = 0002h и биты VM и RF его расширения обнуляются;
в регистре CR0 обнуляются биты PG, TS, EM, MP и РЕ;
CS = F000h (база устанавливается FFFF0000h, лимит – 0FFFFh);
DS = ES = SS = FS = GS = 0000h
Регистр DH после сброса содержит идентификатора процессора Component Id (03-386, 04-486, 05-Pentium, 06-Pentium Pro или Pentium II), DL – номер модели (Revision Id).
Только после сброса и до первой команды межсегментного перехода или вызова на шине адреса в реальном режиме биты A[20:31] в циклах выборки команд имеют единичное значение. Из этого следует, что по крайней мере на начальный период времени после сигнала RESET компьютер должен иметь образ BIOS в адресах FFFFFFF0-FFFFFFFFh, в то время, как в РС 8086/88 имели образ под границей 16-го мегабайта (FFFFFFh). Перемещение BIOS из первого мегабайта памяти в режиме нормальной работы невозможно, поскольку векторы прерывания, ссылающиеся на сервисы BIOS, в реальном режиме могут адресоваться только к памяти в диапазоне адресов 0-0FFFFFh (0-10FFEF) при открытом вентиле Gate A20).
Если во время спада сигнала RESET на определенном входе процессора удерживать низкий уровень сигнала, процессор начнет выполнять внутренний тест BIST (Built-In Self-Test). Тест для 386-го и 486-го процессоров выполняется примерно за 2 в 20-ой степени тактов, что занимает десятки миллисекунд. По окончанию самотестирования процессор начинает работу, как после обычного сброса, а регистр EAX содержит сигнатуру результата тестирования. Об успешном выполнении теста свидетельствует нулевое значение сигнатуры.
2.1.4. Ввод-вывод
Как и 8086, 32-разрядные процессоры позволяют адресовать до 64К однобайтных или 32К двухбайтных регистров в пространстве, отдельном от памяти. Дополнительно имеется возможность обращения к 32-битным портам. При операциях ввода-вывода линии A[16:31] не используются. Адрес устройства задерживается либо в команде (только младший байт, старший – нулевой), либо берется из регистра DX (полный 16-битытный адрес). Команды ввода-вывода вызывают шинные циклы с активными сигналами IORD#, IOWR#. Строковые команды обеспечивают блочный ввод-вывод со скоростью, превышающей аналогичные операции со стандартным контроллером DMA. В адресном пространстве ввода-вывода область 0F8-0FF зарезервирована для использования сопроцессором (при обращении к сопроцессору 386 выставляет единицу на линии А31 шины адреса, что используется для упрощения дешифрации адресов).