Внутренние регистры: Регистры отладки

Печать
Программирование - Архитектура и система команд микропроцессоров x86

 

Отладочные регистры (или регистры отладки) введены в процессоры начиная с Intel386. Они предназначены для использования разработчиками ПО при проверке и отладке кода программы. Эти регистры позволяют устанавливать контрольные точки по коду и читаемым/записываемым данным, выполнять трассировку, отслеживая таким образом места возникновения ошибок. Отладочные регистры являются привилегированным ресурсом и доступны программе либо в режиме реальной адресации, либо в защищенном режиме при CPL = 0.

Доступ к отладочным регистрам осуществляется командой MOV DR. Попытка использования данной команды на уровне привилегий отличном от 0 приводит к генерации ошибки общей защиты (#GP). Для целей отладки и проверки программ могут использоваться и некоторые специальные регистры MSR (Специальные регистры модели) поддерживаемые в процессорах Pentium, Pentium Pro, … Формат отладочных регистров приведен на рис. 1.9.

 

Формат отладочных регистров

Рис. 1.9. Формат отладочных регистров

 

Регистры DR0…DR5

Регистры DR0, DR1, DR2, DR3 содержат линейные адреса четырех точек останова. Сравнение этих адресов производится до трансляции физического адреса. Каждая из четырех точек останова описывается отдельно в регистре DR7.

Регистры DR4 и DR5 зарезервированы. Процессоры Intel386 и Intel486 ассоциируют эти регистры с регистрами DR6 и DR7 соответственно. Когда расширение отладки выключено (CR4.DE = 0), процессоры Pentium … поступают аналогично. Но если включено расширение отладки (CR4.DE = 1), то любые ссылки на регистры DR4 и DR5 приводят к генерации ошибки "неопределенный код операции" (#UD).

 

Регистр DR6

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

B0..B3 (биты 0..3)

Устанавливаются при встрече соответствующей контрольной точки (каждая контрольлная точка должна быть правильно описана битами LENi и R/Wi регистра DR7) несмотря на то, разрешена для нее генерация особой ситуации отладки или нет (задается битами Li и Gi регистра DR7).

BD (бит 13)

Используется совместно с флагом DR7.GD для обеспечения сверхзащиты отладчика. Когда сверхзащита включена (DR7.GD = 1), флаг BD будет устанавливаться, если следующая команда читает или записывает один из отладочных регистров, тем самым сигнализируя отладчику о том, что особая ситуация отладки (#DB) имеет место из-за отказа при попытке обращения к отладочным регистрам.

BS (бит 14)

Бит BS устанавливается, если ловушка отладки генерируется из-за включенного пошагового режима (EFLAGS.TF = 1). Пошаговый режим является наиболее привилегированным, но когда установлен BS, также могут устанавливаться и любые из других битов состояния отладки.

BT (бит 15)

Процессор устанавливает бит BT перед входом в обработчик прерываний отладки, если происходит переключение задач и в TSS новой задачи бит T (бит шлюза отладки) установлен. Переключение происходит нормально, но перед выполнением первой команды новой задачи генерируется ловушка отладки (#DB). Таким образом, бит T в TSS позволяет организовать точки останова при переключении задач (что не может быть задано каким-либо из битов регистра управления отладкой DR7), а бит DR6.BT индицирует отладчику о том, что особая ситуация отладки вызвана переключением задач.

 

Регистр DR7

Регистр управления отладкой DR7 устанавливает режимы срабатывания точек останова и задает вызывающие их срабатывание формы доступа к памяти или вводу/выводу для каждой точки останова.

Li/Gi (биты 0…7)

Биты разрешения соответственно локальных и глобальных контрольных точек. Когда при выполнении программы процессор встречает одну из контрольных точек и для нее установлен соответствующий бит DR7.Li или DR7.Gi, генерируется особая ситуация отладки. Биты Li разрешают устанавливать контрольные точки для конкретных задач, не затрагивая другие. Gi влияют на все задачи. Биты Li автоматически очищаются при переключении задач.

LE, GE (биты 8, 9)

Управляют возможностью "точного соответствия контрольных точек данных". Если LE или GE установлен, сообщение о любой ловушке в контрольной точке по данным будет иметь место непосредственно после завершения команды, которая вызвала пересылку операнда. Если эти биты не установлены, сообщение об останове по данным может поступить спустя несколько команд или не поступить вообще. Рекомендуется устанавливать эти биты всякий раз, когда используются контрольные точки данных. При переключении задач LE очищается, GE — нет.

LENi (биты 18, 19, 22, 23, 26, 27, 30, 31)

Поля LEN задают длину проверяемого значения для каждой контрольной точки (область, внутри которой условия останова могут сработать). Длина может составлять 1, 2 или 4 байта. Значение этих полей интерпретируется следующим образом:

  • 00 – один байт;
  • 01 – два байта;
  • 10 – неопределено;
  • 11 – четыре байта.

Если задано: поле RWi = 00 (прерывание при выполнении команды), то LENi должно быть равно нулю. В зависимости от LEN должно соблюдаться выравнивание адресов контрольных точек (содержаться в DR0…DR3) по границам слов (LENi = 01) или двойных слов (LENi = 11). Перед сравнением адресов процессор маскирует младшие биты записанного в DR0…DR3 адреса битами LENi, а адреса ввода/вывода расширяются нулями с 16 до 32-х бит. Срабатывание точки останова по данным происходит, если адрес хотя бы одного байта из записываемого/читаемого значения попадает в интервал задаваемый адресом в DR0…DR3 и соответствующим значением в поле DR7.LENi. Например, при DR = B0002h, R/W = 11b (чтение/запись данных), LEN = 01b (2 байта): чтение/запись 1 или 2-байтовых операндов по адресу B0002h приведут к срабатыванию ловушки, чтение/запись 4-байтового операнда по адресу B0001h приведет к срабатыванию ловушки, чтение/запись 1 или 2-байтовых операндов по адресу B0000h не приведут к срабатыванию ловушки.

RWi (биты 16, 17, 20, 21, 24, 25, 28, 29)

Биты R и W задают, соответственно, для каждой контрольной точки в DR0…DR3 тип действия, при котором должна сработать ловушка.

  • 00 – выполнение команды;
  • 01 – запись данных;
  • 10 – Intel386, Intel486: неопределено;
           Pentium … : чтение/запись ввода/вывода (если CR4.DE = 1 — включено расширение отладки); неопределено (если CR4.DE = 0);
  • 11 – чтение/запись данных (исключая выборку команд).

IR (Перенаправление прерывания, бит 12: Intel386, Intel486, AMD K5)

Бит IR не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Назначение этого бита – управление перенаправлением прерывания (Interrupt Redirection) в связке с командой INT01. Когда IR = 0, особая ситуация 1 (Прерывание отладки) обрабатывается обычным образом. Если установить IR = 1, то процессор будет пытаться вступить во взаимодействие с внешним оборудованием для входа в режим эмуляции (ICE). Только специальные версии процессоров могут использоваться в составе отладочных стендов в режиме эмуляции. Обычно же соответствующие выводы процессоров (необходимые для взаимодействия с ICE-стендом) не активны. В процессорах, начиная с Pentium и AMD K6, механизм перенаправления прерывания управляется через специальный регистр модели — Probe Mode Control Register (PMCR), а бит IR не используется.

GD (бит 13)

Бит предназначен для защиты отладчика. Используется совместно с битом DR6.BD. Регистры отладки доступны только в реальном режиме или в защищенном режиме при уровне привилегий 0. Установка бита GD в реальном режиме и защищенном режиме на уровне привилегий 0 обеспечивает сверхзащиту всех обращений к регистрам отладки. При необходимости это гарантирует программному отладчику полный контроль над регистрами отладки. Когда бит GD установлен, попытка обратиться к любому из регистров отладки вызывает особую ситуацию 1 (Прерывание отладки). При вызове процедуры обработки бит GD автоматически сбрасывается, что обеспечивает этой процедуре свободный доступ к регистрам отладки, в то же время бит DR6.BD индицирует причину генерации прерывания.

TR (бит 14)

Бит TR (Trace 1) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Установка TR = 1 включает специальный режим трассировки, используемый при работе в составе отладочного стенда (ICE-стенд). В этом режиме после выполнения каждой команды процессор генерирует специальный цикл шины, который помогает внешнему оборудованию отслеживать всю последовательность выполняемых процессором команд.

T2 (бит 15)

Бит T2 (Trace 2) не описан в публичной документации производителей процессоров. По-умолчанию его значение равно 0. Предположительно этот бит также необходим для взаимодействия с отладочным стендом (ICE-стенд). Вероятно он отвечает за индикацию переполнения внешнего лога трассировки, то есть информирует о том, что оборудование отладочного стенда не в состоянии отследить последовательность из множества обрабатываемых процессором команд.