www.mikrocontroller.net

Forum: Compiler & IDEs Heap / Stack Kollision?


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

ich hätte eine Frage bezüglich Heap und Stack; ich verwender malloc für 
einen FIFO Buffer. Wird der FIFO langsamer geleert als gefüllt wächst 
der Heap vom unteren Adressbereich natürlich immer weiter an in Richtung 
Stack, bis schließlich malloc 0 zurück gibt. Woher weiß aber malloc wann 
Schluss ist? Die Größe des Stacks kann malloc nicht kennen und es darf 
auch nicht bis zum oberen Ende gehen, weil irgendwo definitiv der Stack 
beginnt. Ich gehe daher davon aus, dass irgendwo definiert sein muss wie 
weit der Heap wachsen darf. Ist das richtig, und wenn ja wo, und vor 
allem wie kann ich den Wert ggf anpassen? Und was passiert eigentlich 
wenn der Heap den Stack küsst aber noch mehr auf den Stack muss? 
Überschreibt der Stack einfach gnadenlos meinen Heap oder weiß der Stack 
dass darunter Speicher vergeben ist und wenn letzteres was passiert 
dann?
Sorry für die vielen Fragen, aber das interessiert mich gerade wirklich 
brennend!

Gruß
Stefan

Autor: Markus E. (engelmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.rn-wissen.de/index.php/Speicherverbrauc...

> Heap und Stack müssen sich den Speicher, der nicht von .data, .bss und .noinit 
belegt ist, teilen

> Wird der Stackbereich zu groß, weil dort zu viele Daten abgelegt werden  [...] 
dann überschreibt man damit womöglich andere Daten und es kommt zur Fehlfunktion 
des Programmes. Gleiches gilt, wenn die Obergrenze des Heap über der Untergrenze 
des Stabels hinauswächst.

Das sollte eigentlich alles erklären. Weder der Heap noch der Stack 
wissen voneinander :) .
Lies auch mal bei "Dynamischer RAM-Verbrauch" weiter. Vielleicht ist das 
__builtin_alloca was für dich?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wass pasiert ist abhängig von der Hardware. Es ist zB nicht überall so, 
daß Stack auf den Heap folgt oder überhaupt ein linearer Speicher 
vorhanden ist.

Ein Mechanismus ist, daß malloc _sbrk aufruft, um vom OS neuen Speicher 
anzufordern. Je nach implementierung überprüft sbrk gegen das vom Linker 
definierte Symbol _end/end.

Hier eine Implementierung in der libnosys

http://sourceware.org/cgi-bin/cvsweb.cgi/src/libgl...

und für SPU
http://sourceware.org/cgi-bin/cvsweb.cgi/src/libgl...

auf Systemen mit OS wird dann ein Syscall ausgeführt, und das OS kümmert 
sich darum. Idr ist es einer Task nicht erlauft, neuen Speicher zu 
nehmen, aber diese kann ihn vom OS -- das dann mit erweiterten Rechten 
läuft -- anfordern.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus,

schönen Dank für das Dokument, sehr interessant!
Ich habe mir nun einfach damit geholfen das Symbol heap_end zu 
überschreiben:

LDFLAGS += -Wl,--defsym=__heap_end=0x800900

Lieber wäre mir gewesen irgendwie das Symbol __malloc_margin 
hochzusetzten (ist stadardmäßig auf 32 gesetzt), aber das hat leider 
nicht geklappt. Nun begrenze ich die Heapgröße einfach so dass mehr 
Platz für den Stack ist.

Gruß
Stefan

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Lieber wäre mir gewesen irgendwie das Symbol __malloc_margin
> hochzusetzten (ist stadardmäßig auf 32 gesetzt), aber das hat leider
> nicht geklappt.

Muss gehen.  __malloc_margin ist aber eine Variable, die muss man
zur Laufzeit zuweisen.  Im Gegensatz zu den expliziten Heapgrenzen
kann man __malloc_margin auch beliebig während der Laufzeit verändern.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, ich hab's im makefile versucht, vielen Dank!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.