2017-05-09 3 views
1

Ich möchte einen Abbruch der Daten und einen Pre-Fetch-Abbruch erstellen, um zu testen, ob die Exception-Handler für denselben korrekt aufgerufen werden oder nicht. Nach meinem Verständnis kann das Dereferenzieren eines Nullzeigers einen Datenabbruch verursachen. Aber ich bekomme nicht, wie man einen Pre-Fetch-Abbruch zum Testen erstellt. Ich arbeite an armv7a. Ich benutze kein Betriebssystem und arbeite an dem Boot-Code.Wie zum Abbrechen von Daten und zum Abbrechen der Präfektur in Arm v7

Antwort

0

beide sind Busfehler, das Springen in unbekannten Code führt zu einer undefinierten Anweisung, die nicht vorzeitig abgebrochen wird. Ich würde auf unorientierte Zugriffe konzentrieren ein ldr mit Bit 1 setzen und tun ein bx mit Bit 1 gesetzt (aber Bit 0 nicht gesetzt) ​​wäre, wo ich beginne. Wenn diese nicht funktionieren, ist es mit einer Testvorrichtung im Chip möglicherweise nicht möglich.

Es kann Teile des Adressraums geben, die nicht antworten, diese sollten den Prozessor einfach hängen, aber Sie können Glück haben und der Speichercontroller gibt einen Fehler zurück.

Wenn Sie parity oder ecc in Ihrem System haben, wäre dies der beste Weg, vorausgesetzt, Sie haben die Möglichkeit, einen Fehler in diese Speicher zu injizieren, um einen Paritäts- oder ECC-Fehler zu erzwingen Design (wenig bis keine Logik, die für Ihre Frage relevant ist, ist Teil des ARM-Prozessors) gibt einen Fehler bei einem Paritäts- oder ECC-Fehler zurück).

cortex-m könnte an einigen Adressräumen Fehler verursachen, da sie in gewissem Maße bestimmen, wohin Sie gehen sollen.

Wenn einer der neueren Kerne den mmus-Schutz verwenden kann und ich weiß nicht, ob das einen Daten/Prefetch-Fehler zurückgibt oder nicht, richten Sie das MMU so ein, dass etwas Speicherplatz auf einem anderen Zugriffslevel als dem Code ist um es zu treffen und zu sehen, welche Schuld Sie bekommen.

EDIT

hat für einen ARMv7 aber auf einem ARMv6 (pi 1 zum Beispiel) suchen, wenn ich Ausrichtung Überprüfung im Steuerregister zu aktivieren, und tut es ein Ausrichtungsfehler eine ldr der Adresse 0x1001 sagen, das ist dann gibt mir einen Datenabbruch.

eine Codezeile und die Verwendung Adresse 0x01 speichern

mrc p15, 0, r0, c1, c0, 0 
orr r0,#2 
mcr p15, 0, r0, c1, c0, 0 
mov r0,#0x1 
ldr r0,[r0] 

in einen ungültigen Befehl Springen verursacht eine undefinierte keine Prefetch abbrechen, das Speichersystem den Abbruch zu behaupten hat, so dass Sie die MMU dafür verwenden können, wahrscheinlich die meisten,

undefinierte Ausnahme

.globl TEST 
TEST: 
    .word 0xFFFFFFFF 
    bx lr 

einfachste Weg, einen Prefetch Abort zu machen (wie in der ARM ARM angegeben).

.globl TEST 
TEST: 
    bkpt 
+0

ahh Entschuldigung, dass Sie armv7 ... vielleicht habe ich eine Raspberry Pi herumliegen ... –

+0

eine nicht ausgerichtete Adresse, Bx zu 0x1002 nicht Vorabruf noch nicht undefiniert Glück gehabt und es versucht zu laufen, normalerweise würde es schließlich ein undefined treffen, dachte es könnte einen Prefetch auslösen, aber es nicht. –

+0

Lesen des Armv7 ARM es sagt auch BKPT kann verwendet werden, es sei denn, im Hyp-Modus erhalten Sie eine Hyp Trap anstelle eines Prefetch. Im Grunde lesen Sie einfach die Armdokumente. Wenn Sie wissen, dass diese Abbrüche vom Buscontroller kommen, sei es im Kern (mmu zum Beispiel) oder der Chipherstellerlogik, verursachen Daten selbst mit einem gültigen Zugriff keinen Abbruch, könnten aber bestenfalls zu undefinierten Ergebnissen führen ein holen. Sie müssen sich also ideal positionieren, um einen Abbruch der Buslogik zu verursachen, und das heißt, in der Regel die Dokumente des Anbieters zu sehen. BKPT und nicht ausgerichtete Ausnahmen ... –

0

Für einen Datenabbruch können Sie versuchen, einen nicht zugeordneten oder nicht lesbaren Speicherbereich zu lesen. Versuchen Sie zum Beispiel, einen NULL-Zeiger zu lesen/schreiben. Für Prefetch Abbruch nur versuchen, in einigen unmapped, nicht lesbar oder nicht ausführbare Region in eine zufällige Adresse springen (Sie haben MMU in dieser Phase aktiviert?):

mov r0, #0xFFFFFFFF ; Some address that is satisfying the above 
push r0 ; push it to the stack 
pop pc ; jump to that address 

Hinweis, die nur zu einem zufälligen Springen Die Adresse kann stattdessen zu einem nicht definierten Abbruch führen, da sie zwar ausführbar ist, aber eine unbekannte Anweisung enthält.

+0

Wenn ausführbarer Code nicht enthalten ist, wird ein undefinierter Prefetch abgebrochen. –

+0

@old_timer Wenn der Speicherbereich nicht ausführbar, nicht lesbar oder nicht zugeordnet ist, wird Prefetch ausgelöst.Wenn es einen unbekannten Befehl enthält, wird es undefined verursachen –

+0

true, wenn Sie das MMU für das gesetzt haben, aber Verzweigung zu irgendeiner zufälligen Adresse ohne "ausführbaren" Code resultiert einfach in undefined, es sei denn die anderen Sachen, die Sie sagten, also gültig Code ist nicht relevant. –

Verwandte Themen