Spravce pameti
Miroslav Mraz
mrazik na volny.cz
Čtvrtek Listopad 3 19:52:54 CET 2016
Pro lepší pochopení, jak to obvykle funguje - do vlastního malloc() a
free() v knihovně nemá cenu se nějak vrtat. Vlastní přidělení paměti
zajišťuje něco jako _sbrk(), která je volána z vnitřku toho malloc(). A
to je právě to místo, kterým se můžete zabývat. Samotná tato funkce není
složitá, je to něco jako
// HEAP je definovan za .bss, stack jde proti heap dokud se nepotkaji
extern char _end; // Defined by the linker.
//register char * stack_ptr asm ("sp"); // takhle je to v newlib
static inline char * stack_ptr (void) { // pochopitelneji
register char * res;
asm volatile (
"mov %0,sp\r\n" // sp do vysledku
:"=r"(res) :: ); // standardni zapis
return res;
}
const char * _sbrk (int incr) {
static char * heap_end;
char * prev_heap_end;
if (heap_end == NULL) heap_end = & _end;
prev_heap_end = heap_end;
if (heap_end + incr > stack_ptr()) {
/*
No a tady si uděláte co je potřeba, když
už není dost paměti.
*/
return (char *) 0;
}
heap_end += incr;
return (const char *) prev_heap_end;
}
Takhle je to (přibližně) uděláno v newlib, ale samosebou si můžete
definovat vlastní oblast pro haldu jak chcete.
Mrazík
Dne 3.11.2016 v 19:04 Jan Waclawek napsal(a):
> Ano a nie.
>
> V principe by ste si mali to mnozstvo pamate vyhradenej ako heap urcit Vy,
> ci uz priamo v linker skripte alebo jeho obdobe, alebo u klikatora na to
> bude niekde nejake okno. Potom v runtime si mozete zistit ci to tak naozaj
> je, ale ci bude presne kod pana kolegu Nesvacila fungovat to pochopitelne
> zavisi od toho, ci budete mat tie iste symboly v tom linker skripte atd.
>
> *printf ma niekedy svoj vlastny alokator a vyhradzuje si staticky cast
> pamate (v ktorej si potom on sam pre seba dynamicky alokuje co potrebuje,
> to je pre Vas neviditelne a nezasahuje to do "vasho" malloc()). Musite si
> to zistit v dokumentacii ku kniznici, ktoru pouzivate (ja viem, obvykle
> nie je ziadna prip. zdrojaky ;-) ).
>
> wek
>
Další informace o konferenci Hw-list