unterbrochen ist, wie wir wissen, ARM hat einige Register überhöht wie sp und lr. Mit anderen Worten, während in irq Modus sp_usr (und lr_usr) unsichtbar ist, das heißt, beschattet von sp_irq. Also, meine Frage ist, wie der Interrupt-Handler speichert sp_usr. Einige Leute denken vielleicht, dass dies unnötig ist, weil sp_usr automatisch während der Behandlung des Interrupts unverändert bleibt, da es unsichtbar und nicht zugänglich in irq Modus ist. Dies ist jedoch nicht immer der Fall. Stellen Sie sich das folgende Szenario vor:auf ARM, wie die speichern
a) Thread A wird in Benutzerbereich ausgeführt.
b) Ein externer Interrupt tritt auf.
c) Der Handler läuft und stellt fest, dass Thread B, der eine höhere Priorität hat, nun die Ressource hat, auf die er gewartet hat, und entschließt sich, die Zeit neu zu berechnen.
d) Speichert den Kontext Thema A. Nun Gewinde B läuft, zuerst in SVC Modus, dann zurück in Benutzer Modus. Dies ist nur der Moment, wenn der Wert von sp_usr by thread B. außer Kraft gesetzt wird
e) Thema B etwas wie Schlaf nennt. Thread A wird von dem Punkt aus fortgesetzt, an dem er unterbrochen wurde.
Also, wenn sp_usr nicht gespeichert wurde, wenn Thread A unterbrochen wurde, wie würde Thread A seinen Kontext wiederherstellen?
Offensichtlich müssen SP & LR gespeichert und später wiederhergestellt werden. Sie sollten gespeichert werden, wenn sich die CPU im Benutzer- oder Systemmodus befindet. –
Sie sollten klären, welche ARM-Architekturversion Sie betrachten, dies kann sich auf das Detail der Antwort auswirken. –
@Sean Houlihane Ich benutze ARMv7 Cortex-A9 – xiaokaoy