
ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова
.pdfС сегментацией связаны понятия ближнего и дальнего адреса (вызова,
перехода). При ближнем (Near) или внутрисегментном обращении доступ к требуемой ячейке памяти осуществляется только указанием смещения, а ад-
рес сегмента определяется текущим содержимым соответствующего регистра сегмента. При дальнем (Far) или межсегментном обращении указывается полный адрес, содержащий 16-битное значение сегмента (загружаемое в со-
ответствующий сегментный регистр) и 16-битное смещение. Естественно,
что дальние обращения выполняются медленнее (хотя бы из-за пересылки большего количества байтов адреса).
Процессор может обращаться как к одному байту памяти, так и к слову,
состоящему из двух байтов, или к двойному слову (4 байт). Двойное слово обычно используется для хранения полного адреса, и в нем располагается сначала слово смещения (в порядке L-H), а затем сегмента (в том же поряд-
ке). Сегментация памяти и порядок L-H является характерной чертой процес-
соров семейства х86. Вполне очевидно, что любой сегмент может начинаться на границе параграфа (четыре младших бита адреса – нулевые). Кроме того,
принципиально отметить, что при вычислении физического адреса (рис. 22)
возможно возникновение переполнения, которое с 20-разрядной шиной адре-
са приводило к сворачиванию пространства в кольцо. Если, например, Seg = FFFFh и EA = FFFFh, физический адрес, вычисленный по формуле PA = 10h*EA + Seg, получится равным 10FFEFh. Процессором, работающим в ре-
альном режиме, он будет трактоваться как 0FFEFh – адрес, принадлежащий первому мегабайту. Отметим, что сформированный физический адрес в сегменте дается в шестнадцатеричном коде.
Сегмент может начинаться только на 16-байтной границе памяти (так как адрес начала сегмента, по сути, имеет четыре младших нулевых разряда,
как видно из рис. 22), т. е. с адреса, кратного 16. Эти допустимые границы сегментов называются границами параграфов.
Отметим, что введение сегментирования, прежде всего, связано с тем,
что внутренние регистры процессора 16-разрядные, а физический адрес па-
61

мяти 20-разрядный (16-разрядный адрес позволяет использовать память только в 64 Кбайт, что явно недостаточно). В появившемся в то же время процессоре MC68000 фирмы Motorola внутренние регистры 32-разрядные,
поэтому там проблемы сегментирования памяти не возникает.
Применяются и более сложные методы сегментирования памяти.
5.6. Адресация байтов и слов
Многие процессоры, имеющие разрядность 16 или 32, способны адресо-
вать не только целое слово в памяти (16-разрядное или 32-разрядное), но и отдельные байты. Каждому байту в каждом слове при этом отводится свой адрес.
Так, в случае 16-разрядных процессоров все слова в памяти (16-
разрядные) имеют четные адреса. А байты, входящие в эти слова, могут иметь как четные адреса, так и нечетные.
Например, пусть 16-разрядная ячейка памяти имеет адрес 23420, и в ней хранится код 2А5Е (рис. 24).
Рис. 24. Адресация байтов и слов
При обращении к целому слову (с содержимым 2А5Е) процессор вы-
ставляет адрес 23420. При обращении к младшему байту этой ячейки (с со-
держимым 5Е) процессор выставляет тот же самый адрес 23420, но исполь-
62

зует команду, адресующую байт, а не слово. При обращении к старшему бай-
ту этой же ячейки (с содержимым 2А) процессор выставляет адрес 23421 и
использует команду, адресующую байт. Следующая по порядку 16-разрядная ячейка памяти с содержимым 487F будет иметь адрес 23422, т. е. опять же четный. Ее байты будут иметь адреса 23422 и 23423.
Для различия байтовых и словных циклов обмена на магистрали в шине управления предусматривается специальный сигнал байтового обмена. Для работы с байтами в систему команд процессора вводятся специальные ко-
манды или предусматриваются методы байтовой адресации.
5.7. Структура кода команды
Как отмечалось выше, смещение в сегменте кода команд извлекается из регистра EIP и поэтому не требует дополнительных пояснений.
Механизм же формирования смещения в сегменте данных проводится на основе режима адресации операнда и требует отдельного изучения. Рассмот-
рим сначала структуру кода команды универсального 32-разрядного микро-
процессора. Команды в архитектуре IA-32 имеют большое разнообразие форматов, которые зависят от типа операции, режимов адресации операндов,
длины используемых непосредственных операндов и смещений и ряда дру-
гих факторов. Они имеют длину от 1 до 15 байт. Все это существенно за-
трудняет их декодирование в микропроцессоре с данной архитектурой. На рис. 25 представлен формат двухоперандной команды общего вида.
Рис. 25. Формат команды 32-разрядного микропроцессора
63

Команда может начинаться с нескольких необязательных байтов (префик-
сов), которые определяют особенности выполнения команды. Префиксы размеров длины адреса и операндов позволяют изменить их значения, ус-
тановленные по умолчанию битом размерности D
в дескрипторе сегмента. Для операндов совместно с битом W, содержа-
щимся в коде команды, префикс размера позволяет определить операнд длиной 8, 16 или 32 разряда.
Вкоде команды могут использоваться также дополнительные байты для:
●префикса замены сегментного регистра, установленного по умолча-
нию,
●префикса повторения операции,
●префикса, предотвращающего прерывание операции перемещения данных.
Поле КОП содержит код выполняемой команды, а также бит W размер-
ности используемых операндов. Для команд, применяющих непосредствен-
ный операнд, код операции может также занимать часть постбайта.
Постбайт (рис. 26) определяет местоположение операндов. Основная часть команд микропроцессора с архитектурой IA-32 позволяет работать только с одним операндом, находящимся в оперативной памяти. Его режим адресации кодируется полями md и r/m постбайта. Второй операнд либо из-
влекается из регистров общего назначения микропроцессора (его номер ука-
зывается в поле reg постбайта), либо кодируется в поле Imm самой команды
(непосредственный операнд).
Рис. 26. Формат постбайта
64

Байт масштабируемого индекса базы (SIB) служит для представления сложных структур памяти. На его наличие указывает код 100 в поле r/m по-
стбайта. SIB-байт имеет следующую структуру (рис. 27)
Рис. 27. Формат SIB-байта
Здесь SS – поле масштаба, Index задает номер одного из регистров об-
щего назначения (РОН), используемого в качестве индексного регистра (ре-
гистр ESP не может быть регистром индекса). Поле Base в комбинации с по-
лем mod постбайта указывает регистр базы и смещение для индексированных операндов.
Применение SIB-байта позволяет формировать смещение в сегменте,
иногда называемое эффективным адресом (EA), для операндов следующим образом:
где [base] – значение базового регистра, [index] – значение индексного реги-
стра, ss – величина масштабного множителя, disp – значение смещения, зако-
дированного в самой команде. В качестве базы или индекса может быть ис-
пользован любой регистр общего назначения микропроцессора.
Величина индекса может быть умножена на масштабный коэффициент
(1, 2, 4 или 8), что дает возможность ссылки на элемент массива или записи соответствующей длины.
Смещение disp кодируется как величина со знаком в дополнительном коде. Его длина определяется значением бита D в дескрипторе сегмента, би-
том W в первом байте команды и наличием или отсутствием префикса раз-
65
рядности адреса. Этот механизм отражает основные усовершенствования в способах адресации операндов для 32-разрядной архитектуры IA-32 по срав-
нению с архитектурой x86. Различные комбинации слагаемых в выражении для смещения в сегменте дают способы адресации памяти, которые были описаны выше в табл. 1.
6. Прерывания и исключения
Прерывания и исключения нарушают нормальный ход выполнения про-
граммы для обработки внешних событий или сигнализации о возникновении особых условий или ошибок.
Прерывания подразделяются на аппаратные (маскируемые и немаски-
руемые), вызываемые электрическими сигналами на входах процессора, и
программные, выполняемые по команде INT xx. Программные прерывания,
строго говоря, прерываниями не являются – это лишь своеобразный способ вызова процедур, но процессором они обрабатываются как разновидность прерываний.
По прерыванию или исключению процессор сохраняет в стек регистр
(E)FLAGS и указатель CS:(E)IP на ту инструкцию, которую он должен бу-
дет выполнить после обработки прерывания. Этой инструкцией будет сле-
дующая за этой, во время исполнения которой произошло прерывание, или та же самая (при исключениях отказа). В защищенном режиме при возникнове-
нии ряда исключений в стеке сохраняется еще и код ошибки. После сохране-
ния этих значений процессор переходит к исполнению кода обработчика данного прерывания (исключения), определяя точку входа в него через номер
(0–255) по таблице прерываний. Обработчик прерываний (исключения) дол-
жен заканчиваться специальной инструкцией возврата IRET, по которой из стека восстанавливается указатель CS:(E)IP и прежнее значение флагов. Для исключений, в которых сохраняется и код ошибки, обработчик до выполне-
ния инструкции IRET должен извлечь из стека код ошибки.
66
Аппаратные прерывания подразделяются на маскируемые и немаски-
руемые. Процессор может воспринимать прерывания после выполнения каж-
дой команды, длинные строковые команды имеют для восприятия прерыва-
ния специальные окна. Аппаратные прерывания вызываются сигналами на входах INTR и NMI, а также для современных процессоров они могут прихо-
дить по шине APIC.
Маскируемые прерывания вызываются переходом в высокий уро-
вень сигнала на входе INTR (Interrupt Request) при установленном флаге раз-
решения (IF = 1). В этом случае процессор сохраняет в стеке регистр флагов
(при этом сбрасывается флаг IF) и вырабатывает два следующих друг за дру-
гом (back to back) цикла подтверждения прерывания, в которых генерируют-
ся управляющие сигналы INTA# (Interrupt Acknowledge). Высокий уровень сигнала INTR должен сохраняться, по крайней мере, до подтверждения пре-
рывания. Первый цикл подтверждения холостой, по второму импульсу внешний контроллер прерываний передает по шине номер вектора, обслужи-
вающего аппаратное прерывание данного типа. Прерывание с полученным номером вектора выполняется процессором так же, как и программное. Об-
работка текущего прерывания может быть, в свою очередь, прервана немас-
кируемым аппаратным прерыванием, а если обработчик установит флаг IF,
то и другим маскируемым аппаратным прерыванием.
Немаскируемые прерывания выполняются независимо от состоя-
ния флага IF по сигналу NMI (Non Mascable Interrupt). Высокий уровень на этом входе вызовет прерывание с типом (вектором) 2, которое выполняется так же, как и маскируемое. Его обработка не может прерываться под дейст-
вием сигнала на входе NMI до выполнения команды IRET.
Исключения (exceptions), или особые случаи, подразделяются на от-
казы, ловушки и аварийные завершения. Различия заключаются в сохраняе-
мые значениях CS:(E)IP.
67
Отказ (fault) – это исключение, которое обнаруживается и обслу-
живается до выполнения инструкции, вызывающей ошибку. После обслужи-
вания этого исключения управление возвращается снова на ту же инструк-
цию (включая все префиксы), которая вызвала отказ. Отказы, использую-
щиеся в системе виртуальной памяти, позволяют, например, подкачать с дис-
ка в оперативную память затребованную страницу или сегмент.
Ловушка (trap) – это исключение, которое обнаруживается и обслу-
живается после выполнения инструкции, его вызывающей. После обслужи-
вания этого исключения управление возвращается на инструкцию, следую-
щую за вызвавшей ловушку. К классу ловушек относятся и программные прерывания.
Аварийное завершение (abort) – это исключение, которое не позво-
ляет точно установить инструкцию, его вызвавшую. Оно используется для сообщения о серьезной ошибке, такой как аппаратная ошибка или поврежде-
ние системных таблиц.
Набор и обработка исключений реального и защищенного режимов различны. Под исключения в процессорах резервируются векторы 0–31 в
таблице прерываний, однако в PC часть из них перекрываются системными прерываниями.
Процедура, обслуживающая прерывание или исключение, опреде-
ляется по таблице прерываний с помощью номера – 8-битного указателя
(вектора) прерывания. Указатель для программных прерываний задается ко-
мандой, для маскируемых аппаратных прерываний вводится от внешнего контроллера во втором цикле INTA# (или по шине APIC), немаскируемое прерывание имеет фиксированный вектор, а исключения генерируют и пере-
дают вектор внутри процессора.
Каждому номеру (0–255) прерывания или исключения соответству-
ет элемент в таблице дескрипторов прерываний IDT (Interrupt Descriptor Table). В реальном режиме таблица прерываний содержит дальние адреса
(двойные слова) обслуживающих процедур и после сброса располагается, на-
68
чиная с нулевых адресов. Командой LIDT можно изменять положение табли-
цы в пределах первого мегабайта, а размер (03FFh) может быть уменьшен до
007Fh. При попытке обслуживания прерывания с номером, выходящим за размер таблицы, генерируется исключение #DF. В защищенном режиме таб-
лица IDT содержит 8-байтные дескрипторы прерываний, может иметь размер от 32 до 256 дескрипторов и располагаться в любом месте физической памя-
ти.
Анализ условий обслуживания прерываний и исключений выполня-
ется в следующем порядке (по убыванию приоритета):
1. Проверка на исключение-ловушку отладки (#DB) по выполнен-
ной инструкции (пошаговый режим через флаг TF или точка останова по данным через регистры отладки).
2. Проверка на исключение-отказ отладки (#DB) по последующей инструкции (точка останова по инструкции через регистр отладки).
3.Немаскируемое прерывание (аппаратное по входу NMI).
4.Маскируемое прерывание (аппаратное по входу INTR при IF =
1).
5. Проверка на исключение-отказ сегментации (#NP или #GP) при выборке следующей инструкции.
6. Проверка на исключение-отказ страницы (#PF) при выборке сле-
дующей инструкции.
7. Проверка на отказ декодирования следующей инструкции (#UD
или #GP).
8. Для операции WAIT проверка флагов TS и MP (исключение
#NM, если TS = 1 и MP = 1).
9. Для операции ESCAPE (инструкция математического сопроцес-
сора) проверка флагов EM и TS (исключение #NM, если EM = 1 или TS = 1). 10. Для операций WAIT и ESCAPE проверка на исключение #MF от
сопроцессора.
69
11. Проверка на отказ сегментации (#NP, #SS, #GP) или отказ стра-
ницы (#PF) для операндов, используемых в инструкции.
Двойной отказ (Double Fault) – исключение #DF – возникает, когда при обработке исключения, связанного с сегментацией (#TS, #NP, #SS или
#GP), процессор обнаруживает исключение, отличное от отказа страницы
(#PF). Также двойной отказ возникает, если при обработке исключения отка-
за страницы #PF обнаруживается исключение другого типа. В этом случае тоже исполняется исключение #DF.
Если во время обслуживания исключения отказа страницы случается еще один отказ страницы, то происходит аварийный останов (Shutdown)
процессора. Во время аварийного останова никакие новые инструкции не выполняются. Из этого состояния процессор можно вывести только аппарат-
но – сигналом NMI, оставляя его в защищенном режиме, или сигналом RESET, переводящим процессор в реальный режим.
При отработке исключений процессора, работающего в защищенном режиме, сохраняется в стеке слово кода ошибки EC (Error Code), как показано на рис. 28. Если оно отлично от нуля, то в его битах содержится селектор де-
скриптора, с которым связана ошибка, или описание причины отказа (для ис-
ключения – отказ страницы, поскольку там другой формат кода ошибки). Код ошибки сохраняется после содержимого EFLAGS, CS и EIP.
7. Стек. Форма ПОЛИЗ. Стековая машина
Во всех языках программирования есть понятие процедур с локальными переменными. Эти переменные доступны во время выполнения процедуры,
но перестают быть доступными после окончания процедуры. Возникает во-
прос: где должны храниться такие переменные? К сожалению, предоставить каждой переменной абсолютный адрес в памяти невозможно. Проблема за-
ключается в том, что процедура может вызывать себя сама. Eсли процедура вызывается дважды, то хранить ее переменные под конкретными адресами в памяти нельзя, поскольку второй вызов нарушит результаты первого. Вместо
70