== 0 oder == NULL ist beim Vergleich von Zeigern ausreichend, der Cast
ist überflüssig. Aber: woher soll malloc wissen, wie groß der Heap
werden darf? Das ist erst dem Linker bekannt.
"Aber: woher soll malloc wissen, wie groß der Heap
werden darf? Das ist erst dem Linker bekannt."
es geht ja hier um einen laufzeittest. wie geschrieben, bei den avr's
erhält man einen Null pointer wenn man versucht mehr als den noch freien
speicher zu reservieren. müsste doch beim arm auch gehen. oder habe ich
was grundsätzliches missverstanden?
Trotzdem bleibt die Frage offen: woher soll malloc wissen, ob der
Speicher reserviert werden kann, oder ob das Ende des Blocks schon
längst im Stack, potentiellen Stack oder Nirvana liegt?
Welche libc? Falls newlib: sbrk selbst implementiert? Wenn ja wie? Oder
sbrk aus libnosys? Welches Memorylayout (z.B. Data, BSS, Stack, Heap
oder Data, BSS, Heap, Platz, Stack)?
Hallo Martin,
ich verwende die newlib (binutils-2.17, gcc-4.1.1, newlib-1.14.0,
insight-6.5) und linke arm-elf-4.1.1/arm-elf/lib/redboot-syscalls.o
dazu. Früher hab ich mal die libnosys verwendet.
Mein linker script sieht so aus:
die scheint gut zu sein, finde sie nur leider nicht in meinen binutils
(komme mir schon doof vor ;-). ich hab im netz die html seiten gefunden,
sind halt schlecht zu drucken.
gibts das irgendwo als pdf?
die funktion mallinfo liefert (zumindest in meinem setup) ganz nüttliche
informationen. insbesondere arena und uordblks.
ich sehe, daß ich mit malloc immer neuen speicher alloziieren kann, die
zahl wächst über die eigentliche größe des sram hinaus.
Andreas hat da wohl recht: woher weiß malloc wie weit er gehen darf?
ich hatte gedacht, daß der heap automatisch nach .bss bis top end of
sram ist. malloc bekommt ja vom 'system' speicher zugewiesen.
nun hatte ich angenommen, daß malloc 'mitgeteilt bekommt', wenn der heap
ausgeschöpft ist.
wenn ich die docu richtig verstehe, ist es nicht üblich einen heap
explizit einzurichten - oder?
ich konnte mit meminfo mein memory-leakage finden. mein erstes problem
ist damit gelöst.
trotzdem würde mich interessieren, ob es eine möglichkeit gibt, den noch
zu alloziierenden sram zu laufzeit zu ermitteln...
>>> wenn ich das richtig sehe hab ich keinen heap - oder? ich kenn mich mit> linker scripts überhaupt nicht aus...
Layout ist somit .data, .bss, Heap Anfang, Platz für Heap --->, <---
Platz für Stack, Top-Stack. Heap "wächst" zu "grossen"
Speicheraddressen, Stack "wächst" zu "niedrigen" Speicheraddressen. Out
of Memory ist also, wenn der Heap-Pointer >= dem Stack-Pointer ist. sbrk
als syscall für die dynamische Speicherverwaltung "interessiert" sich
eigentlich erstmal nur dafür wo der Heap anfängt. Üblicherweise durch
das im Linkerscript definierte ".end", dem vom Linker ein Wert
zugewiesen wird. Die sbrk-Implementierung aus
newlib-Quellcode/libc/sys/arm/syscalls.c zeigt das Prinzip für eine "out
of memory"-Prüfung ganz anschaulich: wenn aktueller
Heap-Pointer+angeforderter Speicher > Stack-Pointer -> out of memory.
Analog kann man die "Lücke" zwischen Heap und Stack errechnen und hat
damit "available memory". redboot-sbrk hab ich mir bisher nicht
angeschaut, kann ich also nichts zu sagen.
Hoffe, es bringt ein wenig weiter.
Martin Thomas