Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.8.3. Средства обеспечения отладки

Процессоры семейства Р6 реализуют широкий набор вариантов отладки:

программный останов,

пошаговый режим,

отладку с использованием регистров отладки,

отладку с использованием специализированных MSR-регистров,

режим зондовой отладки.

Программный останов. Этот способ отладки реализуется с помощью однобайтной команды INT3, которая вводится программистом в критические точки программы, где необ­ходимо выполнить контроль текущего состояния. Команда INT3 устанавливает безусловную программную точку останова, при выполнении которой процессор реализует исключе­ние #ВР. Команда INT3 выполняется при любых значениях уровня привилегий программы CPL и содержимого поля IOPL. Исключение #ВР всегда вызывается через таблицу IDT. При работе процессора в режиме виртуального 8086 на выполнение команды INT3 не оказыва­ет влияния значение битов в карте перенаправления прерываний (при установленном зна­чении бита VME = 1 в регистре CR4). При вызове подпрограммы обслуживания через шлюз уровень приоритета этого шлюза gDPL должен быть больше или равен CPL

Пошаговый режим. Пошаговый режим имеет место, когда установлено значение при­знака TF=1 в регистре EFLAGS. В этом случае процессор после выполнения каждой коман­ды (ловушка) реализует исключение типа #DB, вызывая соответствующую подпрограмму обслуживания. Перед вызовом этой подпрограммы процессор устанавливает значение признака TF = 0, чтобы обеспечить выполнение обработки без пошаговых остановов. Ко­манда IRET, завершающая подпрограмму обработки, восстанавливает из стека содержи­мое регистра EFLAGS (где значение TF = 1), передавая управление следующей команде программы, после которой снова реализуется прерывание #DB.

Останов с помощью регистров отладки DRO-DR7. Регистры отладки имеют следую­щее назначение:

DR3-0 - содержат линейные адреса четырех контрольных точек останова; DR6 - регистр состояния, указывающий причину останова в контрольной точке; DR7 - регистр управления, задающий условия останова в контрольных точках.

Доступ к регистрам отладки разрешен только программам с уровнем привилегий CPL = 0. Попытка обратиться к этим регистрам на другом уровне привилегий (CPL > 0) приводит к исключению #GP.

Регистры DR4, DR5 в выпускаемых моделях процессоров не используются. Если в реги­стре управления CR4 установлено значение бита DE = 1 (расширение отладки), то обраще­ние к регистрам DR4, DR5 приводит к исключению #UD. Если бит DE = 0, то при вызове DR4, DR5 производится обращение к регистрам DR6, DR7.

Формат содержимого регистров управления DR7 и состояния DR6 отладки показан на рис. 2.63.

Регистр управления отладкой DR7 определяет условия останова для каждой из че­тырех контрольных точек, линейные адреса которых находятся в регистрах DRO-DR3. От­дельные биты и поля в регистре DR7 имеют следующее назначение:

LENi-размер точки останова. Двухбитные поля LEN/указывают, какие биты линейно­го адреса участвуют в определении адреса срабатывания /-и точки останова, определяя, таким образом, размер области памяти, в пределах которой выполняется останов.

При реализации останова по обращению к данным поле LEN/ может принимать следую­щие значения:

  • 00 -1 байт (используются биты А31-0 линейного адреса в регистре DRi);

  • 01-2 байта (используются биты А31-1 линейного адреса);

  • 10-не определено;

  • 11-4 байта (используются биты А31-2 линейного адреса).

Если соответствующее поле R/W/ в регистре DR7 равно 00 (реализация останова по вы­борке команды), то поле LENi должно быть равно 00.

R/Wi-mun доступа. Двухбитные поля R/W/ определяют тип обращения к памяти, при котором происходит срабатывание / - и точки останова. Поле R/Wi может принимать следующие значения:

  • 00-выборка команды;

  • 01-записьданных;

  • 10 -чтение или запись порта ввода/вывода (при значении бита DE = 1 в регистре управ­ления CR4, при DE = 0 значение R/Wi=10 не определено);

  • 11-запись или чтение данных.

Точки останова по выборке команд обрабатываются как ошибки, а точки останова по обращению к данным - как ловушки. Срабатывание точки останова при выборке команды происходит только тогда, когда линейный адрес точки останова указывает на первый байт команды (включая префиксы). Срабатывание точки останова при обращении к данным или портам ввода/вывода имеет место, когда заданный адрес операнда полностью или частично попадает в область срабатывания точки останова (область определяется регис­тром DR/'и полем LENi в регистре DR7).

GD - идентификация обращений к регистрам отладки. Когда установлено значение бита GD = 1, то обращение к регистрам отладки приводит к исключению #DB. В этом слу­чае перед реализацией исключения #DB в регистре состояния DR6 устанавливается зна­чение бита BD = 1, а бит GD сбрасывается в «О», что дает возможность обработчику ис­ключения #DB обращаться к регистрам отладки.

GE, LE -не используемые (резервированные) биты, которые рекомендуется устанав­ливать в «1».

Gi - разрешение глобальных точек останова. Установка этого бита разрешает сраба­тывание соответствующей контрольной точки во всех задачах. Если выполняется усло­вие срабатывания i-й контрольной точки (определенное регистром DRi и полями LENi, R/Wi в регистре DR7) и установлено значение бита Gi = 1, то реализуется исключение #DB. Бит Gi не изменяется при переключении задач.

Li - разрешение локальных точек останова. Установка этого бита разрешает сраба­тывание соответствующей контрольной точки в текущей задаче. Если выполняется усло­вие срабатывания /-и контрольной точки и значение бита L/ = 1, то реализуется исключение #DB. Бит L/автоматически сбрасывается в «О» при переключении задач.

Так как точки останова по выборке команды обрабатываются как ошибки, то после воз­врата из подпрограммы обработки процессор снова попытается выполнить команду, на ко­торую установлена точка останова, и снова будет реализовано исключение #DB. Для пре­дотвращения такого зацикливания на одной точке останова в архитектуре процессора пре­дусмотрен признак RF в регистре EFLAGS. Когда установлено значение RF = 1, то процессор игнорирует точки останова по выборке команды. Значение флага RF не оказывает влияния на срабатывание точек останова по выборке данных или точек останова по операциям вво­да/вывода. Процессор автоматически устанавливает флаг RF = 1 перед вызовом любого исключения-отказа, кроме #DB, которое было вызвано точкой останова по выборке коман­ды. Программа-обработчик исключения #DB может либо запретить точку останова, либо ус­тановить значение признака RF = 1 в содержимом регистра EFLAGS, хранящемся в стеке. При возврате из обработчика команда IRETD восстановит значение признака RF из храня­щегося в стеке содержимого регистра EFLAGS. Команды POPF, POPFD и IRET не изменяют значение RF. После возврата повторной генерации исключения #DB не произойдет, так как значение признака RF = 1. Процессор автоматически устанавливает значение RF = 0 после выполнения любой команды, кроме команды IRETD и команд JMP, CALL, INT n, которые вы­зывают переключение задач. Процессор не устанавливает признак RF перед вызовом ис­ключений-ловушек, аппаратных или программных прерываний.

Регистр состояния DR6 содержит информацию, которая указывает причину последнего исключения отладки #DB. Отдельные биты содержимого DR6 имеют следующее назначение:

ВТ-ошибка при переключении задач. Принимает значение ВТ = 1, если исключение #DB имело место из-за переключения на задачу, имеющую бит Т = 1 в сегменте TSS. Ис­ключение #DB происходит после выполнения первой команды в новой задаче. Если ис­ключение #DB обрабатывается через шлюз задачи, то бит Т в сегменте TSS обработчика должен иметь значение «1».

BS - реализация пошагового режима отладки. Принимает значение BS = 1, если ис­ключение #DB имело место из-за установленного значения признака TF = 1 в регистре EFLAGS. Исключение пошагового режима самое приоритетное среди исключений отладки. Вместе с битом BS может быть установлен любой другой бит в регистре DR6.

BD - отказ при обращении к регистрам отладки при установленном бите GD в реги­стре DR7. Значение BD = 1 устанавливается, если исключение #DB происходит из-за по­пытки обратиться к регистрам отладки, когда установлен бит GD в регистре управления от­ладкой DR7. Перед передачей управления обработчику исключения #DB бит GD в регистре управления отладкой DR7 сбрасывается в «О». Это дает возможность обработчику исклю­чения #DB обращаться к регистрам отладки.

В/- останов в 1-й контрольной точке. Четыре бита индикации останова соответствуют четырем регистрам DRO-DR3. Значение В/ = 1 устанавливается при выполнении условий, оп­ределенных регистром DR/ и полями LEN/, R/W/ в регистре DR7. Биты В; устанавливаются в «1» даже в том случае, когда соответствующая точка останова не разрешена с помощью битов L/7G/ в регистре DR7. Если одновременно выполняются условия для нескольких точек останова и хотя бы одна из этих точек останова разрешена, то реализуется исключение #DB. При этом значения битов В/ = 1 будут установлены для всех точек останова.

Биты регистра DR6 устанавливаются в «1» аппаратно при реализации соответствую­щих исключений. Сброс этих битов в нулевое значение выполняется программно, путем загрузки нового содержимого в регистр DR6. Эта процедура осуществляется программой обработки исключения #DB, которая перед возвратом к исходной программе должна очис­тить регистр DR6, установив значение «О» для всех битов.

Поддержка отладки с помощью MSR-регистров. Процессоры семейства Р6 содержат пять MSR регистров, которые предоставляют дополнительные возможности отладки: DebugCtlMSR (адрес 1 D9h), LastBranchTolP (адрес 1 DCh), LastBranchFromlP (адрес 1 DBh), LastExceptionTolP (адрес 1 DEh) и LastExceptionFromlP (адрес 1 DDh).

На рис. 2.64 приведен формат содержимого регистра DebugCtlMSR, с помощью кото­рого производится управление режимом отладки. Его отдельные биты имеют следующее назначение:

BTF - бит разрешения пошаговых ветвлений. Когда значение BTF = 1, процессор интер­претирует значение признака TF = 1 в регистре EFLAGS как «пошаговые ветвления», а не «пошаговые команды». Это означает, что исключение #DB будет генерироваться только при обнаружении ветвления, прерывания или исключения. Бит BTF автоматически уста­навливается в «О» перед передачей управления обработчику исключения #DB.

PBi - биты разрешения выдачи внешних сигналов при останове в контрольных точках. Когда бит Pbi = 1, то на соответствующем выходе процессора устанавливается сигнал BPi# = 0 при останове в контрольной точке, определенной регистром DRi. Когда значение битов PBi = 0, то выводы BPi# используются для вывода данных о мониторинге производи­тельности процессора.

TR - бит разрешения выдачи сообщений о трассировке ветвлений. Если установлено значение TR=1, то процессор при выполнении ветвления, прерывания или исключения выдает на системную шину адрес исходной команды и команды, которой передается уп­равление. Трассировка ветвлений приводит к снижению производительности процессора, так как о каждом ветвлении выполняется сообщение по системной шине.

LBR - бит разрешения записи информации о ветвлениях. При установке значения LBR = 1 процессор фиксирует все передачи управления. Когда происходит ветвление, про­цессор заносит в регистр LastBranchFromlP адрес команды ветвления, а в регистр LastBranchTolP- адрес самого перехода. Если реализуется прерывание или исключение (кроме исключения #DB), процессор копирует значение регистров LastBranchFromlP и LastBranchTolP в регистры LastExceptionFromlP и LastExceptionTolP соответственно. Затем адрес прерванной команды заносится в регистр LastBranchFromlP, а адрес вызываемого обработчика - в регистр LastBranchTolP. Бит LBR автоматически устанавливается в «О» перед передачей управления обработчику исключения #DB.

Таким образом, использование отладочных MSR-регистров обеспечивает дополнитель­ные возможности контроля выполнения программы в процессе ее отладки.

Режим зондовой отладки. Этот способ отладки реализуется с помощью тестового пор- , та ТАР, который служит для тестирования процессора и подключенных к нему устройств системы. Специальный режим «зондовой» отладки (Probe Mode) позволяет использовать порт ТАР для ввода команд и данных, чтения и записи содержимого всех внутренних реги­стров процессора. С помощью этого режима можно обеспечить выполнение отлаживаемой программы, контролируя и корректируя содержимое регистров.