2008-11-27 8 views
6

Wie greife ich auf die Benutzer R13 und R14 zu, die gespeichert werden, wenn der Supervisor-Modus eingegeben wird? Ich verwende ein ARM7TDMI.ARM. Zugriff auf Benutzer R13 und R14 aus dem Supervisor-Modus

I.E. Ich möchte nicht auf den Supervisor R14 zugreifen, der jetzt die Rückkehradresse in den Benutzermodus enthält, sondern den Wert des Linkregisters des Benutzermodus. Dies ist Teil eines Debuggers, den ich schreibe.

Gibt es spezielle Aliase für diese Register?

Dank

Antwort

9

Ich werde die Antwort auf Ihre Frage beschreiben, aber der gleiche Ansatz gilt auch für andere Modi.

Sie müssen den Prozessormodus ändern, indem Sie die Modusbits im CPSR in den Systemmodus ändern. Dadurch erhalten Sie Zugriff auf den SP/LR des Benutzermodus (R13 & R14). Denken Sie daran, dass der Systemmodus privilegiert ist, aber R13 und R14 sind identisch mit den Benutzermodi R13 und R14.

Sobald Sie im Systemmodus sind, lesen Sie R13 und R14 und legen Sie sie wo Sie wollen. Dann schalte einfach die Modus-Bits zurück in deinen vorherigen Modus (ich glaube, das war in deinem Beispiel der Supervisor-Modus) und du kannst loslegen.

Beachten Sie, dass wir nicht vom Supervisor- in den Benutzermodus gewechselt haben. Wenn Sie vom Supervisor zum Benutzer wechseln, , können Sie nicht zum Supervisor-Modus zurückkehren. (Sonst gäbe es keinen Schutz vor den Zugriffsrechten für den Benutzercode). Aus diesem Grund haben wir den Systemmodus verwendet - der Systemmodus ist privilegiert, aber die Register sind identisch mit dem Benutzermodus.

Sie können beliebig zwischen beliebigen privilegierten Modi wechseln, indem Sie die Modusbits im CPSR manipulieren. Ich denke, dass sie die unteren 5 Bits sind? Ich bin auf der Straße & habe nicht die Informationen an meinen Fingerspitzen. Sonst hätte ich Ihnen den Assembler-Code für das, was ich oben beschrieben habe, zur Verfügung gestellt. Eigentlich, wenn du ein paar Haare auf deine Brust legen willst, nimm das, was ich dir oben gegeben habe, implementiere es, teste es und poste es hier zurück. :-D

(Eine Sache, die ich für den "allgemeinen Fall" hinzufügen sollte (Ihr ist sehr spezifisch) - Sie können den SPSR untersuchen, um zu sehen, "wo Sie herkamen" - und verwenden, um zu bestimmen, welcher Modus Sie müssen zu wechseln.)

Übrigens habe ich gerade dies kürzlich für einen meiner Kunden .... kleine Welt, denke ich.

+0

Wow Dank. Ich habe nie bemerkt, dass Benutzermodus und Systemmodus dieselben Register teilen! Ich werde den Code knacken. Ich fürchte, ich kann es hier nicht posten, weil es für ein Stück courswork ist - aber ich denke, dass Sie die Prinzipien sehr gut beschrieben haben, was wichtiger ist. – Tarski

+0

Gern geschehen. Viel Glück bei der Kursarbeit. – Dan

+0

Hi Dan, wenn ARM im Hyp-Modus ist und den R13/r14 von PL1 NS = 1 Modus (SVC) lesen muss, wie würde es gemacht werden? – mSO

3

Ich habe einen besseren Weg entdeckt: -

Wenn ein STM tun, wenn r15 nicht einer der Operanden ist dann^ermöglicht den Zugriff auf User-Mode-Register. Das Autoinkrementieren scheint jedoch nicht innerhalb der Anweisung zu funktionieren, und ein NOP wird anschließend benötigt, wenn Sie auf die Registerbank zugreifen möchten.

So etwas wie

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode 
nop 
sub r13, r13, #8  ;update stack pointer 
+0

Der^ist nur in ARMv6 und neuer, IIRC verfügbar. –

+0

Das ist ein großartiger Fund! Laut http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihcadda.html, diese Verwendung ist jedoch "veraltet". Nicht wirklich sicher, ob ich mich darum kümmern soll. – Brendan