Stack kopieren!?



  • Hallo Leute,

    als kleine Spielerei würde ich gern einfach den Programm Stack kopieren. Dabei würde ich aus eine C funktion herraus, in inline assembler den stack lessen, und in einer liste/Array etc. speichern!?
    Ich hab mich etwas eingelesen, ich könnte über den Stackpointer element per elem kopieren und in die liste schmeißen!?! wie geh ich das den an?

    Könnte ich einfach mal den Stack meines rechners mit einem kleinen C programm welches ich in VS2008 schreibe auslesen??

    Ich weiß eine seltsame idee von mir^^

    Grüße



  • CDiscoverer schrieb:

    Ich hab mich etwas eingelesen, ich könnte über den Stackpointer element per elem kopieren und in die liste schmeißen!?! wie geh ich das den an?

    Wo liegt dein Problem?

    CDiscoverer schrieb:

    Könnte ich einfach mal den Stack meines rechners mit einem kleinen C programm welches ich in VS2008 schreibe auslesen??

    Auf deinem Rechner gibts just in diesem Moment sehr viel mehr als einen Stack. Jeder Thread hat mindestens einen...



  • ja jeder thread hat doch seinen eigenen progamm instruktion stack!?!? oder welche stack gibts es den noch??

    Die größe der Elemente auf dem STack ist ja architekturabhängig bei nem x86 rechner 32bit groß?

    naja vll. sollte ich mich erst mal mehr mit assembler beschäftigen:) aber danke dot;)



  • CDiscoverer schrieb:

    ja jeder thread hat doch seinen eigenen progamm instruktion stack!?!? oder welche stack gibts es den noch??

    Was ist denn ein instruction stack? 😉

    Jeder Thread hat einen User Mode Stack, das ist der, den du als "Stack" kennst. Allerdings gibt es mindestens auch noch einen Kernel Mode Stack, der benötigt wird wenn dein Thread einen Syscall ausführt. Auf den hast du aber natürlich keinen Zugriff...



  • hehe.. ja mir is da grad kein bessere begriff eingfallen^^

    ok, sagen wir mal ich hab nen ganz simplen microcontroller, und will preamtives mutlitrheading machen, muss ich ja den "stack" beim taskwechsel zwischenspeichern! und auch noch "sämpliche" register?

    wie komm ich den an den stackpointer? wie heist der den?

    😃



  • CDiscoverer schrieb:

    ok, sagen wir mal ich hab nen ganz simplen microcontroller, und will preamtives mutlitrheading machen, muss ich ja den "stack" beim taskwechsel zwischenspeichern! und auch noch "sämpliche" register?

    Der Stack ist doch einfach nur ein Speicherbereich. Du brauchst also nicht den ganzen Stack kopieren, das wär doch unglaublich langsam. Alles was du tun musst ist, den Stackpointer des aktuellen Thread sichern und durch den Stackpointer des nächsten Thread zu ersetzen...

    CDiscoverer schrieb:

    wie komm ich den an den stackpointer? wie heist der den?

    Das hängt wohl von der Architektur deines Mikrocontrollers ab...



  • hmmm ?? schau doch mal da:

    http://wiki.osdev.org/Multitasking_Systems

    Bei: "How does it work!"

    Da wird beschrieben, dass der ganze stack inhalt gespeichert wird, und der von nem anderen task geladen wird (das alles in nem interrupt) danach spring er wieder aus dem interrupt, und der cpu arbeitet mit dem geladen stack an der stelle weiter..

    versteh ich da was falsch? 😕



  • Ja. Wo liest du das denn dort?



  • oh du hast recht:

    If you still want to figure out, imagine a machine with an accumulator and a stack pointer.

    wie würd ich den auf meinem rechner in nem c pogramm den stack pointer speichern?=



  • Mit purem Standard C gar nicht. Entweder über irgendwelche Compiler Intrinsics (siehe Doku deines Compilers), Assembler (Assembler lernen) oder entsprechende Funktionalität deines Betriebssystems (siehe Doku deines Betriebssystems).



  • Ja verstehe. Wen ich mit pro "Task" nur den Stack Pointer merken muss, wie ist dann gewährleist, das die beiden Stacks der jweiligen Task sich nich gegenseitig im Speicher überschreiben!? is das ne Doofe Frage? wenn ja, dann hab ich es nich verstanden^^



  • CDiscoverer schrieb:

    Ja verstehe. Wen ich mit pro "Task" nur den Stack Pointer merken muss, wie ist dann gewährleist, das die beiden Stacks der jweiligen Task sich nich gegenseitig im Speicher überschreiben!?

    So: http://en.wikipedia.org/wiki/Virtual_memory



  • Ja das versteh ich. aber der virtual memory gibts es ja nur auf ner höheren abstraktion ebene.. Anwedungs schicht.. überm kernel. Aber wenn ich nen primitven microcontroller habe, auf dem ich multithreadin realsieren möch, da muss ich doch den gesamen prozess-kontext (+ stack) des cpus pro task speicheren.. beim prozessswitch!

    Hier ein ausschnitte aus freeRTOS.. (hier wird unten der hardware stack gsichert)

    #define	portSAVE_CONTEXT( ucForcedInterruptFlags )								\
    {																				\
    	_asm																		\
    		/* Save the status and WREG registers first, as these will get modified	\
    		by the operations below. */												\
    		MOVFF	WREG, PREINC1													\
    		MOVFF   STATUS, PREINC1													\
    		/* Save the INTCON register with the appropriate bits forced if			\
    		necessary - as described above. */										\
    		MOVFF	INTCON, WREG													\
    		IORLW	ucForcedInterruptFlags											\
    		MOVFF	WREG, PREINC1													\
    	_endasm																		\
    																				\
    	portDISABLE_INTERRUPTS();													\
    																				\
    	_asm																		\
    		/* Store the necessary registers to the stack. */						\
    		MOVFF	BSR, PREINC1													\
    		MOVFF	FSR2L, PREINC1													\
    		MOVFF	FSR2H, PREINC1													\
    		MOVFF	FSR0L, PREINC1													\
    		MOVFF	FSR0H, PREINC1													\
    		MOVFF	TABLAT, PREINC1													\
    		MOVFF	TBLPTRU, PREINC1												\
    		MOVFF	TBLPTRH, PREINC1												\
    		MOVFF	TBLPTRL, PREINC1												\
    		MOVFF	PRODH, PREINC1													\
    		MOVFF	PRODL, PREINC1													\
    		MOVFF	PCLATU, PREINC1													\
    		MOVFF	PCLATH, PREINC1													\
    		/* Store the .tempdata and MATH_DATA areas as described above. */		\
    		CLRF	FSR0L, 0														\
    		CLRF	FSR0H, 0														\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	POSTINC0, PREINC1												\
    		MOVFF	INDF0, PREINC1													\
    		MOVFF	FSR0L, PREINC1													\
    		MOVFF	FSR0H, PREINC1													\
    		/* Store the hardware stack pointer in a temp register before we		\
    		modify it. */															\
    		MOVFF	STKPTR, FSR0L													\
    	_endasm																		\
    																				\
    		/* Store each address from the hardware stack. */						\
    		while( STKPTR > ( unsigned char ) 0 )								\
    		{																		\
    			_asm																\
    				MOVFF	TOSL, PREINC1											\
    				MOVFF	TOSH, PREINC1											\
    				MOVFF	TOSU, PREINC1											\
    				POP																\
    			_endasm																\
    		}																		\
    																				\
    	_asm																		\
    		/* Store the number of addresses on the hardware stack (from the		\
    		temporary register). */													\
    		MOVFF	FSR0L, PREINC1													\
    		MOVF	PREINC1, 1, 0													\
    	_endasm																		\
    																				\
    	/* Save the new top of the software stack in the TCB. */					\
    	_asm																		\
    		MOVFF	pxCurrentTCB, FSR0L												\
    		MOVFF	pxCurrentTCB + 1, FSR0H											\
    		MOVFF	FSR1L, POSTINC0													\
    		MOVFF	FSR1H, POSTINC0													\
    	_endasm																		\
    }
    


  • CDiscoverer schrieb:

    Ja das versteh ich. aber der virtual memory gibts es ja nur auf ner höheren abstraktion ebene.. Anwedungs schicht.. überm kernel.

    Nein. Virtual Memory ist ein Feature der Hardware. In Software wäre das viel zu lahm...

    CDiscoverer schrieb:

    Aber wenn ich nen primitven microcontroller habe, auf dem ich multithreadin realsieren möch, da muss ich doch den gesamen prozess-kontext (+ stack) des cpus pro task speicheren.. beim prozessswitch!

    Ich kenn deine Mikroarchitektur nicht. Vielleicht musst du ja wirklich, wer weiß...



  • Ahh Virtual Memory gibts auch auf Hardware Ebene:) danke Dot:) Ja das Code Beispiel ist von nem PIC 18F...! Vll. hat der keinen Virtuellen Speicher.. hmm



  • Virtual Memory funktioniert nur mit Hardwaresupport, alles andere wäre unpraktikabel was die Performance betrifft.
    Ich bin ehrlich gesagt kein Experte für Mikrocontrolleprogrammierung, aber anstatt Beispiele für irgendeine Architektur zu suchen, solltest du dich wohl besser einfach mal mit der konkreten Architektur auseinandersetzen für die du dein Betriebssystem bauen willst...



  • Ja dot , danke:) Ich setzt ,ich jetzt auch mal mit hardware architekturen und assembler auseinander;) danke für die infos;)


Log in to reply