Жмакин А.П. Архитектура ЭВМ (2006) (1186252), страница 31
Текст из файла (страница 31)
□ ловушка контрольной точки по переключению задачи (в сегменте TSS бит' Т= 1).
Немаскируемое прерывание NMI (2)— единственное внешнее радиальное прерывание.
Контрольная точка (3)— формируется при выполнении команды int3 (код операции — CCh). Передача управления обработчику особого случая является частью команды int3, адрес возврата в стеке относится к началу следующей команды. Тот же обработчик вызывается при выполнении внешнего прерывания с вектором 03 или двухбайтовой команды int 03.
Переполнение (4) — возникает при выполнении команды into при условии установки в 1 флага переполнения OF. Как и для int3, передача управления обработчику особого случая является частью команды into, адрес возврата в стеке относится к началу следующей команды. Обычно команда into применяется в компиляторах для выявления переполнения в арифметике знаковых чисел. Тот же обработчик вызывается при выполнении внешнего прерывания с вектором 04 или команды int 04.
Нарушение границы массива (5)— возникает при выполнении команды bound, если контрольная проверка дает отрицательный результат, т. е. проверяемый (первый) операнд не попадает в диапазон значений, определенных вторым (нижняя граница) и третьим (верхняя граница) операндами команды.
Недействительный код операции (6)— генерируется, когда операционное устройство процессора обнаруживает неверный код операции, несоответствие типа операндов коду операции, попытку выполнения привилегированных команд в R-режиме, неверные байты mod r/m или sib, использование префикса блокировки LOCK с командами, которые нельзя блокировать. Характерно, что существует несколько одно- и двухбайтовых кодов, зарезервированных фирмой Intel для развития системы команд, и хотя им в 80486 не соответствуют никакие команды, зарезервированные коды не вызывают особого случая.
Устройство^ недоступно (7) — возникает в двух ситуациях:
□ процессор выполняет команду esc и бит ЕМ (эмуляция сопроцессора) в регистре CR0 установлен в 1;
□ процессор выполняет команду wait или esc и бит TS (переключение задачи) в регистре CR0 установлен в 1.
В первом случае программист намерен выполнить операции плавающей арифметики программно.
Второй случай может возникнуть после переключения задачи. Бит TS аппа-ратно устанавливается в 1 при переключении задачи, а первая же встретившаяся в новой задаче команда сопроцессора вызывает особый случай 7, ибо контекст устройства с плавающей точкой старой задачи не сохранен. Обработчик особого случая 7 сохраняет старое состояние устройства с плавающей точкой в сегменте TSS старой задачи и загружает новое состояние устройства из сегмента TSS новой задачи. (В случае работы цепочки вложенных задач обработчик должен программно отследить ту старую задачу, которая последней использовала FPU.) После этого привилегированной командой clts сбрасывается флажок TS и осуществляется возврат на команду устройства с плавающей точкой. Так как теперь флаг TS сброшен, команда сопроцессора будет выполнена.
Двойное нарушение (8)— обычно, когда процессор обнаруживает особый случай при попытке вызвать обработчик предыдущего особого случая, два особых случая обрабатываются последовательно. Если процессор не может обрабатывать их последовательно, он сигнализирует о двойном нарушении.
Для определения того, когда о двух нарушениях следует сообщать как о двойном нарушении, процессор подразделяет все особые случаи на три класса:
□ легкие особые случаи — векторы 1, 2, 3, 4, 5, 6, 7,16;
□ тяжелые особые случаи — векторы 0, 10, 11, 12,13;
□ страничные нарушения — вектор 14.
Когда возникают два легких особых случая или один легкий и один тяжелый, эти два события допускают последовательную обработку. При появлении двух тяжелых событий их обработать нельзя, поэтому процессор формирует особый случай двойного нарушения. Аналогичное состояние наступает, если после страничного нарушения возникает тяжелый особый случай или второе страничное нарушение, хотя если, наоборот, после тяжелого особого случая возникает страничное нарушение, эти события могут быть обработаны.
Если при попытке вызвать обработчик двойного нарушения возникает любое другое нарушение, процессор переходит в режим отключения. Этот режим аналогичен состоянию процессора после выполнения команды hlt. До восприятия сигналов NMI или RESET никакие команды не выполняются, причем если отключение возникло при выполнении обработчика немаскируемого прерывания, запустить процессор может только сигнал RESET. Недействительный сегмент TSS (10)— возникает при попытке переключения на задачу с неверным сегментом TSS. Поскольку сегмент TSS может определять LDT, сегменты кода, стека, данных, к особому случаю 10 относятся ситуации с нарушением границ этих сегментов, нарушением прав доступа, запретом записи в сегмент стека и др. Нарушения могут возникать как в ком-тексте старой, так и новой задачи, поэтому обработчик особого случая 10 должен сам быть задачей и вызываться через шлюз задачи (десятая строка IDT должна содержать шлюз задачи).
Неприсутствие сегмента (11)— формируется, когда бит присутствия сегмента в дескрипторе Р = 0. Это нарушение допускает рестарт, если обработчик особого случая 11 реализует механизм виртуальной памяти на уровне сегментов.
Нарушение стека (12) — возникает в двух ситуациях:
□ в результате нарушения предела любой операции, которая обращается к регистру SS (pop, push, enter, неявное использование стека при обращении к памяти, например, mov ах, [вр+6]);
□ при попытке загрузить в регистр SS дескриптор, который отмечен неприсутствующим.
Нарушение общей защиты (13) — все нарушения защиты, которые не служат причиной конкретного особого случая, вызывают особый случай общей защиты:
□ превышение предела сегмента (кроме стека);
□ передача управления сегменту, который не является выполняемым;
□ запись в защищенный от записи сегмент;
□ считывание из выполняемого сегмента;
□ загрузка в SS селектора сегмента, защищенного от записи;
□ загрузка в регистры SS, DS, ES, FS, GS селектора системного сегмента;
□ загрузка в регистры SS, DS, ES, FS, GS селектора выполняемого сегмента;
□ обращение к памяти через DS, ES, FS, GS, когда в них пустой селектор;
□ переключение на занятую задачу;
□ нарушение правила привилегий и др.
Страничное нарушение (14)— возникает, когда разрешено страничное преобразование и имеет место одна из следующих ситуаций:
□ в элементе каталога разделов или таблицы страниц, используемом для преобразования линейного адреса в физический, сброшен бит присутствия;
□ процедура не имеет достаточного уровня привилегий для доступа к адресуемой странице. Ошибка операции с плавающей точкой (16)— сигнализирует об ошибке, возникшей в команде устройства с плавающей точкой.
Контроль выравнивания (17)— возникает при нарушении выравнивания операндов. Операнды считаются выровненными, если адрес двухбайтового слова является четным (младший разряд равен 0), адрес четырехбайтового двойного слова кратен 4, а адрес восьмибайтовой структуры данных кратен 8. Для разрешения контроля выравнивания должны выполняться три условия:
□ бит AM в регистре CR3 установлен;
□ флаг АС установлен;
□ выполняется программа на уровне привилегий 3.
7.4. Средства отладки
Традиционно средства отладки микропроцессоров ограничивались наличием:
□ короткой команды программного прерывания, которую можно было устанавливать вместо первого байта любой команды;
□ аппаратной реализации пошагового (покомандного) режима, который инициировался установкой специального бита Т в регистре флагов.
По мере усложнения МПС возможности внешних аппаратных средств по наблюдению операций, происходящих внутри процессора, уменьшаются. Поэтому в схемах мощных процессоров стали предусматривать разнообразные средства отладки.
Основу средств отладки в процессорах *86 старших моделей составляют специализированные регистры отладки — программируемые регистры задания контрольных точек, регистры управления и состояния отладки. Они заменяют собой средства аппаратных внутрисхемных эмуляторов. Процессоры *86 старших моделей обеспечивают не только покомандную работу, но и регистрацию переключения на конкретную задачу, установку контрольных точек по адресам команд и фиксацию модификации значений переменных в памяти.
Регистры отладки поддерживают контрольные точки по командам и данным. В общем, под контрольной точкой понимается адрес, при использовании которого программой возникает особый случай отладки. Установка контрольной точки по команде обеспечивает регистрацию команды по любому линейному адресу. Задание контрольной точки по данным позволяет узнать, когда производится обращение к конкретной переменной.
Отладочные средства х86 включают в себя:
□ однобайтовую команду контрольной точки татз, которую можно вставлять в программу по любому адресу; при выполнении этой команды генерируется особый случай отладки;
□ флаг пошагового режима TF в регистре EFLAGS, позволяющий выпол- j нить программу по командам;
□ четыре регистра отладки DR0—DR3, которые определяют четыре незави- I симые контрольные точки по командам или данным; регистр управления ] отладкой DR7 и регистр состояния отладки DR6;
□ флаг ловушки Т в TSS, который вызывает особый случай отладки при пе- I реключении на задачу с установленным в 1 битом Т;
□ флаг возобновления RF в регистре EFLAGS, с помощью которого подавляются многократные особые случаи в одной и той же команде.
Все эти средства действуют как ловушки, следя за возникновением условий, представляющих интерес для программиста. Когда возникает такое условие, формируется особый случай отладки (с вектором 1); только команда штз генерирует прерывание с вектором 3. Зарезервированный вектор отладки 1 упрощает процедуру вызова отладчика.
Итак, отладчик по вектору 1 вызывается в следующих случаях:
□ при TF = 1 после каждой команды;
□ при TTSS = 1 в момент переключения на задачу;
□ ловушка контрольной точки по данным;
□ нарушение контрольной точки по команде.
Команда INT3 предоставляет альтернативный способ задания контрольной точки и особенно удобна, если контрольные точки размещаются в исходном коде или требуется установить более четырех контрольных точек.
Программные контрольные точки задаются путем замены обычных команд на команды гатз — при этом требуется осуществлять запись в сегмент кода (создавать альтернативный сегмент данных), а после отладки — восстанавливать исходный код. Использование аппаратных контрольных точек исключает необходимость модификации кода (можно отлаживать программу, размещенную в ПЗУ), а так же допускает контроль обращения к данным.
Рассмотренные средства позволяют вызывать отладчик как процедуру в контексте текущей задачи или как отдельную задачу при выполнении одного из следующих условий:
□ выполнение команды контрольной точки шгз;
□ выполнение любой команды (при TF = 1);
□ выполнение команды по указанному адресу;
□ считывание или запись байта, слова или двойного слова по указанному адресу;
□ запись байта, слова или двойного слова по указанному адресу;
□ переключение на конкретную задачу;
□ попытка изменить содержимое регистра отладки.
7.4.1. Регистры отладки
Регистры отладки, форматы которых приведены на рис. 7.14, включают в себя:
□ четыре регистра DR0—DR3, предназначенные для хранения линейных адресов четырех контрольных точек, каждая из которых независимо может быть определена как контрольная точка по команде или по данным;
□ регистр DR7 управления отладкой, включающий поля, которые определяют свойства контрольных точек и некоторые параметры процесса отладки;
□ регистр DR6 состояния отладки, предназначенный для идентификации причины прерывания отладки;
□ наконец, зарезервированные регистры DR5, DR4.
Рассмотрим форматы регистров состояния и управления.
Выше отмечалось, что все события отладки, кроме int3, вызывают прерывание с вектором 1. Следовательно, при возникновении особого случая отладки встает вопрос о причине прерывания. Именно для идентификации причин прерывания 1 предусмотрен регистр состояния отладки DR6.
Младшие четыре бита ВО—ВЗ относятся к четырем контрольным точкам и единичное состояние В/ означает достижение контрольной точки, линейный адрес которой находится в регистре DR/.
Флаг BS (Step) устанавливается в 1, когда процессор начинает отрабатывать особый случай, вызванный ловушкой покомандной работы, т. е. при BS = 1 причиной особого случая является состояние TF = 1 регистра EFLAGS. Этот случай имеет высший приоритет среди всех случаев отладки, когда BS = 1, могут быть установлены и другие биты состояния отладки.
Флаг ВТ (Task) устанавливается в 1, когда особый случай отладки вызван переключением на задачу, в TSS которой установлен бит ловушки Т =1.
Регистры отладки доступны (по записи или чтению) только в реальном режиме или в защищенном режиме по привилегированной (т. е. разрешенной к выполнению только на нулевом уровне) команде mov: