Das CPSR (Statusregister) ist ein zentrales Register, das den aktuellen Zustand, wie etwa die ALU-Flags und den aktuellen Betriebsmodus des Prozessors speichert. Die Flags werden automatisch indirekt durch arithmetische und logische Operationen oder Vergleichegesetzt. Die Bits 4 bis 0 des Statusregisters bestimmen, in welchem Modus der Prozessor arbeitet. Unpriviligierte Modi haben im Gegensatz zu priviligierten Modi keinen direkten(!) Zugriff auf das CPSR zur Änderung der ALU-Flags oder der Betriebsmodi. Dieser Schutzmechanismus verhindert, dass Anwendungsprogramme den kritischen Systemstatus beeinflussen können, was die Sicherheit des Systems gewährleistet.
Mode: | Encoding: | Priv.-Level: |
---|---|---|
usr: | 10000 | PL0 |
fiq: | 10001 | PL1 |
irq: | 10010 | PL1 |
svc: | 10011 | PL1 |
mon: | 10110 | PL1 |
abt: | 10111 | PL1 |
hyp: | 11010 | PL2 |
und: | 11011 | PL1 |
sys: | 11111 | PL1 |
Ein Wechsel von einem niedrigeren zu einem höheren Privilegierungslevel, wie vom User-Modus zum Supervisor-Modus, erfolgt durch Systemaufrufe (Syscalls) und Interrupts. Dieser Mechanismus stellt sicher, dass der Wechsel in einen privilegierten Modus nur unter kontrollierten Bedingungen stattfindet. Umgekehrt können privilegierte Modi den Prozessor jedoch in einen weniger privilegierten Modus zurückversetzen, um die Kontrolle an weniger kritische Programme zu übergeben.
Um in der Systemprogrammierung auf einem ARM-Prozessor direkt auf Steuer- und Statusregister zugreifen zu können, verwendet man spezielle Instruktionen wie MRS und MSR.
MSR <Destination>, <Source>
MRS <Destination>, <Source>
Beim Starten des Prozessors wollen wir überprüfen, ob er sich im Supervisormode befindet und wenn ihn “Schlafen legen”, also in eine Dauerschleife führen, sollte das nicht der Fall sein.
EQUS für die benötigten Konstanten:
.equ MODE_MASK, 0x1F
.equ MODE_USR, 0x10
.equ MODE_IRQ, 0x12
.equ MODE_SVC, 0x13
...
Überprüfen des Betriebsmodus:
MRS r0, cpsr
MOV r1, #MODE_MASK
AND r2, r0, r1
CMP r2, #MODE_SVC
BNE sleep
...
sleep:
B sleep
zurück | Hauptmenü | weiter |