En la arquitectura x86 , un registro de depuración es un registro utilizado por un procesador para la depuración de programas . Hay seis registros de depuración, denominados DR0 ... DR7 , con DR4 y DR5 como sinónimos obsoletos de DR6 y DR7. Los registros de depuración permiten a los programadores habilitar de forma selectiva varias condiciones de depuración asociadas con un conjunto de cuatro direcciones de depuración. Dos de estos registros se utilizan para controlar las características de depuración. Se accede a estos registros mediante variantes de la instrucción MOV. Un registro de depuración puede ser el operando de origen o el operando de destino. Los registros de depuración son recursos privilegiados; las instrucciones MOV que acceden a ellos solo se pueden ejecutar en el nivel de privilegio cero. Un intento de leer o escribir los registros de depuración cuando se ejecuta en cualquier otro nivel de privilegio provoca un fallo de protección general .
Cada uno de estos registros contiene la dirección lineal asociada con una de las cuatro condiciones de punto de interrupción. Cada condición de punto de interrupción se define además mediante bits en DR7.
Los registros de direcciones de depuración son efectivos independientemente de si la paginación está habilitada o no . Las direcciones en estos registros son direcciones lineales. Si la paginación está habilitada, las direcciones lineales se traducen en direcciones físicas mediante el mecanismo de paginación del procesador . Si la paginación no está habilitada, estas direcciones lineales son las mismas que las direcciones físicas.
Tenga en cuenta que cuando la paginación está habilitada, las diferentes tareas pueden tener diferentes asignaciones de direcciones físicas a lineales. Cuando este es el caso, una dirección en un registro de dirección de depuración puede ser relevante para una tarea pero no para otra. Por este motivo, el x86 tiene bits de habilitación globales y locales en DR7. Estos bits indican si una dirección de depuración determinada tiene relevancia global (todas las tareas) o local (solo la tarea actual).
El registro de estado de depuración permite al depurador determinar qué condiciones de depuración se han producido. Cuando el procesador detecta una excepción de depuración habilitada, activará los bits correspondientes de este registro antes de entrar en el controlador de excepciones de depuración.
En algunas implementaciones, B0-B3 se pueden configurar para puntos de interrupción que coinciden pero no están habilitados [1] ; por lo tanto, el controlador de depuración solo debe verificar los bits que corresponden a los puntos de interrupción habilitados.
Además, depende de la implementación si el hardware borrará B0-B3 en caso de condiciones de punto de interrupción que no coincidan; por lo tanto, se recomienda que los controladores de depuración borren manualmente estos bits antes de regresar a la tarea interrumpida. [2]
DEBUGCTL
( MSR 1D9h
), cualquier instrucción que provoque un bloqueo de bus (principalmente instrucciones que usan el LOCK
prefijo para realizar operaciones atómicas de memoria que se extienden a lo largo de los límites de la línea de caché u operan en memoria no almacenable en caché) borrará el bit 11 de DR6 y provocará una excepción #DB de tipo trampa. Los procesadores no configuran ni borran este bit de otra manera; se recomienda que los controladores de depuración configuren este bit en 1 antes de regresar a la tarea interrumpida.En algunas implementaciones, este bit puede configurarse incluso si DR7.GD no está configurado. [1]
XBEGIN
instrucción que inició la transacción; de lo contrario, la transacción se anula sin generar excepciones.El registro de control de depuración se utiliza para habilitar de forma selectiva las cuatro condiciones de punto de interrupción de dirección y para especificar el tipo y el tamaño de cada uno de los cuatro puntos de interrupción. Hay dos niveles de habilitación: los niveles local (0, 2, 4, 6) y global (1, 3, 5, 7). El procesador restablece automáticamente los bits de habilitación local en cada cambio de tarea para evitar condiciones de punto de interrupción no deseadas en la nueva tarea. Los bits de habilitación global no se restablecen con un cambio de tarea; por lo tanto, se pueden utilizar para condiciones que son globales para todas las tareas.
En los procesadores posteriores, los puntos de interrupción son siempre exactos: los bits 9:8 de DR7 todavía están presentes como bits escribibles y se recomienda configurarlos, pero la CPU los ignora.
F1h
( "ICEBP"
/ "INT01"
) a:10b
en procesadores donde el bit CR4.DE falta o está establecido en cero no está definido.Para los puntos de interrupción de ejecución de instrucciones, la longitud del punto de interrupción debe establecerse en 00b
(1 byte) o, de lo contrario, el comportamiento no está definido.
El comportamiento del uso de la longitud del punto de interrupción 10b
(8 bytes) fuera del modo de 64 bits no está definido.
No son registros reales. En los procesadores que admiten el bit CR4.DE (Intel Pentium y posteriores), su comportamiento está controlado por CR4.DE:
En los procesadores sin CR4.DE , el comportamiento no está definido oficialmente: normalmente, DR4/5 tienen alias de DR6/7, pero existen excepciones que se han utilizado para la detección de CPU. [10]