Forum: Mikrocontroller und Digitale Elektronik main stack vs process stack (Cortex-M4)


von Sina A. (sinapse)


Lesenswert?

Im Programming Manual für den Cortex M4 steht (Abschnitt 2.1.3)

"In an OS environment, it is recommended that threads running in Thread 
mode use the process stack and the kernel and exception handlers use the 
main stack."

Es gibt also die zwei stacks. empfohlen wird die nutzung des einen für 
den kernel eines betriebssystems. der andere soll fuer threads genutzt 
werden.

aber es steht nicht da, weshalb man das so machen soll. welche vorteile 
ergeben sich denn durch diese aufteilung?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ein Userprozess ist generell nicht vertrauenswürdig und sollte daher 
nicht auf dem Kernelstack rumwutzen dürfen.

Daher bekommt der Prozess nen eigenen.

von Sina A. (sinapse)


Lesenswert?

hmm... aber welcher mechanismus verhindert denn auf dem cortex-m4 ein 
schreiben vom userprozess in den main stack???

von (prx) A. K. (prx)


Lesenswert?

Eine Trennung der Stacks ergibt hauptsächlich dann Sinn, wenn man 
mehrere Threads (Prozesse) hat, also beispielsweise in einem RTOS. Dann 
ist es recht sinnvoll, Interrupt-Handler automatisch auf dem Systemstack 
laufen zu lassen, statt auf dem Stack des grad laufenden und evtl. als 
Folge des Interrupts weggedrückten Threads.

von Sina A. (sinapse)


Lesenswert?

hmm... jetzt sagst du auch dass es sinnvoll ist aber nicht warum.


das letzte stueck deiner aussage hab ich nicht richtig verstanden

"und evtl. als Folge des Interrupts weggedrückten Threads."

könntest du das nochmal erklären


danke schonmal fuer die antworten

lg

von (prx) A. K. (prx)


Lesenswert?

sina anargo schrieb:
> hmm... jetzt sagst du auch dass es sinnvoll ist aber nicht warum.

Andernfalls müsstest du den Stack-Platz für sämtliche möglicherweise 
verschachtelten Interrupt-Handler auf jedem einzelnen Thread-Stack 
vorsehen. Mit getrennten Stacks statt dessen nur einmal.

von Sina A. (sinapse)


Lesenswert?

ui... super, das macht sinn. dankööö

von Dr. Sommer (Gast)


Lesenswert?

sina anargo schrieb:
> hmm... aber welcher mechanismus verhindert denn auf dem cortex-m4 ein
> schreiben vom userprozess in den main stack???
Die MPU.

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Die MPU.

Und wer kümmert sich bei einem M0 darum?

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Und wer kümmert sich bei einem M0 darum?
Keiner, denn der ist nicht so für Multitasking und OSse ausgelegt.

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> no MPU schrieb:
>> Und wer kümmert sich bei einem M0 darum?
> Keiner, denn der ist nicht so für Multitasking und OSse ausgelegt.

Der hat keine zwei Stacks?

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Der hat keine zwei Stacks?
doch, aber keine MPU. Daher nur "trusted"/"kooperatives" Multitasking, 
d.h. wenn man sicher ist dass die Anwendungsprogramme nicht mutwillig 
Unsinn machen.

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> no MPU schrieb:
>> Der hat keine zwei Stacks?
> doch, aber keine MPU.

Dr. Sommer schrieb:
> sina anargo schrieb:
>> hmm... aber welcher mechanismus verhindert denn auf dem cortex-m4 ein
>> schreiben vom userprozess in den main stack???
> Die MPU.

???

Die Stackumschaltung hat nichst mit der MPPU zu tun.
Und 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABDGADF.html 
sagt uns: Der user Prozess kann den Main Stack nutzen.

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Die Stackumschaltung hat nichst mit der MPPU zu tun.
Richtig.
> Und
> 
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABDGADF.html
> sagt uns: Der user Prozess kann den Main Stack nutzen.
Es sei denn, man schützt ihn mit der MPU, falls vorhanden. Das macht 
Sinn, wenn man nicht-vertrauenswürdige Programme laden will.

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Es sei denn, man schützt ihn mit der MPU

In welchem Modus wird festgelegt, welcher Stack zu verwenden ist? Wie 
kann ich zwischen den Modus wechseln?

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> In welchem Modus wird festgelegt, welcher Stack zu verwenden ist?
Der Stack kann jederzeit beliebig geändert werden 
(StackPointer-Register); unprivilegierter Code kann eben nur nicht auf 
geschützten Speicher zugreifen.
> Wie
> kann ich zwischen den Modus wechseln?
Über CONTROL.nPRIV

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Der Stack kann jederzeit beliebig geändert werden

Es kann in jedem Modus zwischen den beiden Stacks gewechselt werden?

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Es kann in jedem Modus zwischen den beiden Stacks gewechselt werden?
Ja:
1
mov r0, #42
2
mov sp, r0
Lässt den Stackpointer auf die Adresse 42 zeigen. Wüsste übrigens keine 
Architektur unter der das nicht geht.

von Svenska (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Wüsste übrigens keine Architektur unter der das nicht geht.

6502. :-)

von Dr. Sommer (Gast)


Lesenswert?

Svenska schrieb:
> 6502. :-)
Achja, natürlich... Okay, sagen wir, alle Architekturen die Stack-Frames 
"unterstützen", d.h. den Stack für lokale Variablen und nicht nur für 
Rücksprungadressen nutzen, können das ;-)

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> no MPU schrieb:
> Es kann in jedem Modus zwischen den beiden Stacks gewechselt werden?
>
> Ja:mov r0, #42
> mov sp, r0
>
> Lässt den Stackpointer auf die Adresse 42 zeigen. Wüsste übrigens keine
> Architektur unter der das nicht geht.

So,so,damit ist der Wechsel zwischen Main stack und process stack 
möglich?

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> So,so,damit ist der Wechsel zwischen Main stack und process stack
> möglich?
Warum nicht? Ob das eine gute Idee ist ist eine andere Frage. Nur drauf 
schreiben/lesen kann man eben nicht falls die MPU entsprechend 
konfiguriert ist.

von no MPU (Gast)


Lesenswert?

Schon einmal auf einem M0 ausprobiert, ob das im unprivileged thread 
mode geht?

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABDGADF.html
Dann dem link MSR folgen.

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Schon einmal auf einem M0 ausprobiert, ob das im unprivileged
> thread
> mode geht?
>
> http://infocenter.arm.com/help/index.jsp?topic=/co...
> Dann dem link MSR folgen.
Da gibts keinen Link MSR.

Recherchier doch einfach selber wenn du mir nicht glaubst, anstelle von 
100 Detailfragen hintereinander zu stellen. Und sieh dir mal die 
Disassembly eines beliebigen kompilierten C-Programms an, und du wirst 
Dinge finden wie:
1
b087        sub  sp, #28
und
1
ac03        add  r4, sp, #12
Was macht das wohl? Richtig, einfach einen durch gewöhnliche Arithmetik 
berechneten Wert in den Stack-Pointer schreiben. Das heißt, jedes 
ordinäre C Programm das lokale Variablen verwendet greift schreibend auf 
den Stack Pointer zu. Und das ist unabhängig vom Privileged-Mode; wär ja 
doof wenn unpriviligierte C-Programme keine lokalen Variablen verwenden 
könnten.

von no MPU (Gast)


Lesenswert?

Ich habe recherchiert und ARM schreibt, dass es nicht geht. Wenn du den 
links folgst, kommst du auch dahinter. Sonst probiert es aus und 
schaltet auf einem M0 zwischen Main und Prozess stack um.

von Dr. Sommer (Gast)


Lesenswert?

Bitte, wenn du das sagst. Einen M0 habe ich gerade nicht zur Hand. Aber 
wenn du meinst dass man den Stack Pointer nicht ändern kann, wie, 
glaubst du, funktionieren dann o.g. Assembler-Snippets? Dann würde ja 
kein C-Programm funktionieren.

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Dann würde ja
> kein C-Programm funktionieren.

???

Beim Cortex M steht der akteulle SP im R13. Bei unterschiedlicher 
Konfiguration (main stack und process stack) wird beim Wechsel von 
unprivileged Thread in den Handler Mode der Stack oder umgekehrt 
automatisch umgeschaltet. Was gerade los ist steht im CONTROL register.
Soll die Konfiguration verändert werden, muss man in einen privileged 
Mode wechseln.
Kannst du alles unter den links nachlesen.

Und das ist die Antwort auf die Ausgangsfrage:
sina anargo schrieb:
> hmm... aber welcher mechanismus verhindert denn auf dem cortex-m4 ein
> schreiben vom userprozess in den main stack???

Natürlich kann ich mit einem Pointer beliebig im Speicher rühren. Das 
verhindert die MPU. Aber das war nicht die Frage.

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Bei unterschiedlicher
> Konfiguration (main stack und process stack) wird beim Wechsel von
> unprivileged Thread in den Handler Mode der Stack oder umgekehrt
> automatisch umgeschaltet. Was gerade los ist steht im CONTROL register.
> Soll die Konfiguration verändert werden, muss man in einen privileged
> Mode wechseln.
Ja, den Modus nur so. Aber den Stack Pointer kann man trotzdem manuell 
auf was anderes zeigen lassen, wenn die MPU es nicht verhindert.

no MPU schrieb:
> Kannst du alles unter den links nachlesen.
Warum fragst du erst jedes Bisschen nach, um es dann doch selber 
rauszusuchen und mir zu erklären was ich angeblich falsches geschrieben 
habe?

von no MPU (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Warum fragst du erst jedes Bisschen nach, um es dann doch selber
> rauszusuchen und mir zu erklären was ich angeblich falsches geschrieben
> habe?

Ich habe nicht gefragt, sondern wollte dich zum Denken anregen. Das hat 
du nicht gemerkt?

Die Links sind als Hilfe für dich gedacht. Wenn man hier nur so 
schreibt, glaubt es keiner.

von Dr. Sommer (Gast)


Lesenswert?

no MPU schrieb:
> Ich habe nicht gefragt, sondern wollte dich zum Denken anregen. Das hat
> du nicht gemerkt?
AHAHa, und ich dachte du trollst nur. Vielen Dank für deine Erleuchtung, 
sonst verbringe ich meine Tage immer in gedankenloser Finsternis!
> Die Links sind als Hilfe für dich gedacht. Wenn man hier nur so
> schreibt, glaubt es keiner.
Ich habe die ARMv6/7 Architecture Reference Manuals sogar als PDF und 
ich hatte da alles schon vorher nachgelesen, keine Sorge.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.