x86 Debug-Register - x86 debug register

Auf der x86-Architektur ist ein Debug-Register ein Register, das von einem Prozessor zum Debuggen von Programmen verwendet wird . Es gibt sechs Debug-Register namens DR0 ... DR7 , wobei DR4 und DR5 als veraltete Synonyme für DR6 und DR7 gelten. Die Debug-Register ermöglichen es Programmierern, verschiedene Debug-Bedingungen, die einem Satz von vier Debug-Adressen zugeordnet sind, selektiv zu aktivieren. Zwei dieser Register werden verwendet, um Debug-Funktionen zu steuern. Auf diese Register wird durch Varianten des MOV-Befehls zugegriffen. Ein Debug-Register kann entweder der Quelloperand oder der Zieloperand sein. Die Debug-Register sind privilegierte Ressourcen; die MOV-Befehle, die darauf zugreifen, können nur auf der Berechtigungsebene Null ausgeführt werden. Ein Versuch, die Debug-Register zu lesen oder zu schreiben, während die Ausführung auf einer anderen Berechtigungsebene erfolgt, führt zu einem allgemeinen Schutzfehler .

DR0 bis DR3

Jedes dieser Register enthält die lineare Adresse, die einer von vier Haltepunktbedingungen zugeordnet ist. Jede Breakpoint- Bedingung wird durch Bits in DR7 weiter definiert.

Die Debug-Adressregister sind unabhängig davon wirksam, ob das Paging aktiviert ist oder nicht . Die Adressen in diesen Registern sind lineare Adressen. Wenn das Paging aktiviert ist, werden die linearen Adressen durch den Paging-Mechanismus des Prozessors in physikalische Adressen übersetzt . Wenn das Paging nicht aktiviert ist, sind diese linearen Adressen die gleichen wie die physikalischen Adressen.

Beachten Sie, dass bei aktiviertem Paging verschiedene Tasks unterschiedliche lineare-zu-physikalische Adresszuordnungen aufweisen können. Wenn dies der Fall ist, kann eine Adresse in einem Debug-Adressregister für eine Task relevant sein, für eine andere jedoch nicht. Aus diesem Grund hat der x86 in DR7 sowohl globale als auch lokale Freigabebits. Diese Bits zeigen an, ob eine gegebene Debug-Adresse eine globale (alle Tasks) oder lokale (nur aktuelle Tasks) Relevanz hat.

DR6 - Debug-Status

Das Debug-Statusregister ermöglicht es dem Debugger zu bestimmen, welche Debug-Bedingungen aufgetreten sind. Wenn der Prozessor eine aktivierte Debug-Ausnahme erkennt, setzt er die niederwertigen Bits dieses Registers (0,1,2,3), bevor er in den Debug-Ausnahme-Handler eintritt .

Beachten Sie, dass die Bits von DR6 niemals vom Prozessor gelöscht werden. Um Verwirrung beim Identifizieren der nächsten Debug-Ausnahme zu vermeiden, sollte der Debug-Handler unmittelbar vor der Rückkehr Nullen in DR6 verschieben.

DR7 - Debug-Steuerung

Die acht niederwertigen Bits von DR7 (0,2,4,6 und 1,3,5,7) aktivieren selektiv die vier Adress-Haltepunktbedingungen. Es gibt zwei Ebenen der Aktivierung: die lokale (0,2,4,6) und die globale (1,3,5,7) Ebene. Die lokalen Freigabebits werden vom Prozessor bei jedem Taskwechsel automatisch zurückgesetzt, um ungewollte Breakpoint-Bedingungen in der neuen Task zu vermeiden. Die globalen Freigabebits werden durch einen Taskwechsel nicht zurückgesetzt; Daher können sie für Bedingungen verwendet werden, die für alle Tasks gelten.

Bits 16-17 (entspricht DR0), 20-21 (DR1), 24-25 (DR2), 28-29 (DR3), definieren wann Breakpoints auslösen. Jeder Breakpoint hat einen Zwei-Bit-Eintrag, der angibt, ob er bei der Ausführung (00b), beim Datenschreiben (01b), beim Datenlesen oder beim Schreiben (11b) unterbrochen wird. 10b ist definiert als Unterbrechung beim Lesen oder Schreiben von E/A, aber keine Hardware unterstützt dies. Die Bits 18-19 (DR0), 22-23 (DR1), 26-27 (DR2), 30-31 (DR3) definieren, wie groß ein Speicherbereich von Breakpoints überwacht wird. Auch hier hat jeder Breakpoint einen Zwei-Bit-Eintrag, der angibt, ob er ein (00b), zwei (01b), acht (10b) oder vier (11b) Bytes überwacht.

Siehe auch

Verweise

  • Intel 80386 Programmierreferenz

Externe Links