alexatmk wrote:
> Hallo Martin,
>
1 | > ...
|
2 | > _end = .;
|
3 | > PROVIDE (end = .);
|
4 | >
|
5 | >
|
6 | > .int_data :
|
7 | > {
|
8 | > *(.internal_ram_top)
|
9 | > }> STACK
|
10 | >
|
11 | >
|
12 | >
|
13 | > /* Stabs debugging sections. */
|
14 | >
|
15 | >
|
>
>
> 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