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