Hallo alle, Ich habe die Harvard Architektur und den GCC noch nicht ganz verstanden. In meinem Programmsystem habe ich irgendwann zufällige Programmaufrufe. Nach meiner Erfahrung geht das nur mit "Stacküberschreibern" und "Interruptvektorüberschreibern". Stacküberschreiben in C tut man mit Varargs. Verwende ich nicht, gibts noch eine Möglichkeit ? Wie müßte ein Code in C aussehen, der den Interruptvektor ändert? Wie ist das mit "(void *) 0" an eine Funktion als Basisadresse eines Arrays übergeben, und dann auf das X-te Element zugreifen? Schreibt das Programm Code oder Datencode? Und liegen die IVs im Programmbereich? Oder ist das alles ganz anders mit Harvard ... Danke für Tips, Mario
Stacküberlauf hat mit Harvard nix zu tun. Wenn der Stack nicht ausreicht und in andere Daten wächst und diese überschreibt (oder andere daten damit Stack-Inhalte überschreiben), wächst er eben in andere Daten... ob Harvard oder nicht.
EDUARDO Mario schrieb: > Stacküberschreiben in C tut man mit Varargs. Verwende ich nicht, gibts > noch eine Möglichkeit ? Zu große lokale Variablen, Schreiben hinter ein Array-Ende, Benutzung von nicht/falsch initialisierten Zeigern oder Array-Indizes, zuviele globale Variable, zuviel dynamische Speicheallokation, ... > Wie müßte ein Code in C aussehen, der den Interruptvektor ändert? Gibt's nicht, zumindest nicht aus Versehen. > Wie ist das mit "(void *) 0" an eine Funktion als Basisadresse eines > Arrays übergeben, und dann auf das X-te Element zugreifen? Schreibt das > Programm Code oder Datencode? Zuerst kommen die normalen Register, dahinter die I/O-Register, dann das RAM. > Und liegen die IVs im Programmbereich? Auf Programmspeicher kannst du beim avr-gcc nur über spezielle C-Funktionen zugreifen.
EDUARDO Mario schrieb: > Oder ist das alles ganz anders mit Harvard ... Mal es dir halt mal auf. Du hast einen Speicherbereich (Flash) für das Programm, und einen zweiten (SRAM) für die Daten. Beide fangen bei Adresse 0 an. Am Anfang des Flashs liegen die Interruptvektoren. Schreiben kann man das Flash aus dem Programm zwar prinzipiell auch, aber nicht unbeabsichtigt. In den Anfang des SRAM sind die Register des Prozessors gemappt, im weiteren SRAM dann die globalen und statischen Variablen, vom Ende her wächst der Stack. Oliver
Oder einfach mal ins Datenblatt schauen. Da ist genau so ein Bild schon drin.
Hier ist ein Bildchen, das das Speichermodell von avr-gcc zeigt: http://www.rn-wissen.de/index.php/Speicherverbrauch_bestimmen_mit_avr-gcc
Rolf Magnus schrieb: > Oder einfach mal ins Datenblatt schauen. Wer macht denn sowas? Doku lesen ist doch uncool, da schreibt man lieber mal schnell eine noob-Frage ins Forum ;) Oliver
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.