(Nema provera objašnjenih u ovom rezimeu i neki slučajevi su izostavljeni radi sažetosti)
__libc_malloc pokušava da dobije deo iz tcache, ako ne uspe, poziva _int_malloc
_int_malloc :
Pokušava da generiše arenu ako ne postoji
Ako postoji brzi deo odgovarajuće veličine, koristi ga
Popunjava tcache sa drugim brzim delovima
Ako postoji mali deo odgovarajuće veličine, koristi ga
Popunjava tcache sa drugim delovima te veličine
Ako tražena veličina nije za male delove, konsoliduje brzi deo u nesortirani deo
Proverava nesortirani deo, koristi prvi deo sa dovoljno prostora
Ako je pronađeni deo veći, podeli ga da vrati deo i dodaj ostatak nazad u nesortirani deo
Ako je deo iste veličine kao tražena veličina, koristi ga da popuni tcache umesto da ga vrati (dok tcache ne bude pun, onda vrati sledeći)
Za svaki deo manje veličine koji se proverava, stavi ga u odgovarajući mali ili veliki deo
Proverava veliki deo u indeksu tražene veličine
Počinje da gleda od prvog dela koji je veći od tražene veličine, ako se neki pronađe, vrati ga i dodaj ostatke u mali deo
Proverava velike delove iz sledećih indeksa do kraja
Iz sledećeg većeg indeksa proverava bilo koji deo, podeli prvi pronađeni deo da ga koristi za traženu veličinu i dodaj ostatak u nesortirani deo
Ako ništa nije pronađeno u prethodnim delovima, uzmi deo iz vrhunskog dela
Ako vrhunski deo nije bio dovoljno velik, povećaj ga sa sysmalloc
__libc_malloc
Funkcija malloc zapravo poziva __libc_malloc. Ova funkcija će proveriti tcache da vidi da li postoji bilo koji dostupni deo željene veličine. Ako postoji, koristiće ga, a ako ne, proveriće da li je u jednom niti i u tom slučaju će pozvati _int_malloc u glavnoj areni, a ako ne, pozvaće _int_malloc u areni niti.
__libc_malloc kod
```c // From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
victim = _int_malloc (ar_ptr, bytes); /* Retry with another arena only if we were able to find a usable arena before. */ if (!victim && ar_ptr != NULL) { LIBC_PROBE (memory_malloc_retry, 1, bytes); ar_ptr = arena_get_retry (ar_ptr, bytes); victim = _int_malloc (ar_ptr, bytes); }
if (ar_ptr != NULL) __libc_lock_unlock (ar_ptr->mutex);
</details>
Napomena kako će uvek označiti vraćeni pokazivač sa `tag_new_usable`, iz koda:
```c
void *tag_new_usable (void *ptr)
Allocate a new random color and use it to color the user region of
a chunk; this may include data from the subsequent chunk's header
if tagging is sufficiently fine grained. Returns PTR suitably
recolored for accessing the memory there.
_int_malloc
Ovo je funkcija koja alocira memoriju koristeći druge binove i top chunk.
Početak
Počinje definisanjem nekih varijabli i dobijanjem stvarne veličine koju traženi prostor za memoriju treba da ima:
Fast Bin
Ako je potrebna veličina unutar veličina Fast Bins, pokušajte da koristite deo iz fast bin. U suštini, na osnovu veličine, pronaći će indeks fast bin-a gde bi validni delovi trebali biti locirani, i ako ih ima, vratiće jedan od njih.
Štaviše, ako je tcache omogućena, napuniće tcache bin te veličine sa fast bins.
Tokom izvođenja ovih akcija, izvršavaju se neki bezbednosni provere:
Ako je deo neusklađen: malloc(): unaligned fastbin chunk detected 2
Ako je napredni deo neusklađen: malloc(): unaligned fastbin chunk detected
Ako vraćeni deo ima veličinu koja nije ispravna zbog svog indeksa u fast bin-u: malloc(): memory corruption (fast)
Ako je bilo koji deo korišćen za punjenje tcache-a neusklađen: malloc(): unaligned fastbin chunk detected 3
malloc_consolidate
Ako to nije bio mali deo, to je veliki deo, i u ovom slučaju malloc_consolidate se poziva da bi se izbegla fragmentacija memorije.
Neuređeni kontejner
Vreme je da proverimo neuređeni kontejner za potencijalno validan deo koji možemo koristiti.
Početak
Ovo počinje sa velikom for petljom koja će prolaziti kroz neuređeni kontejner u bk pravcu dok ne stigne do kraja (arena struktura) sa while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
Pored toga, neki sigurnosni provere se vrše svaki put kada se razmatra novi deo:
Ako je veličina dela čudna (previše mala ili previše velika): malloc(): invalid size (unsorted)
Ako je veličina sledećeg dela čudna (previše mala ili previše velika): malloc(): invalid next size (unsorted)
Ako se prethodna veličina koju označava sledeći deo razlikuje od veličine dela: malloc(): mismatching next->prev_size (unsorted)
Ako nije victim->bck->fd == victim ili nije victim->fd == av (arena): malloc(): unsorted double linked list corrupted
Kako uvek proveravamo poslednji, njegov fd bi trebao uvek da pokazuje na arena strukturu.
Ako sledeći deo ne označava da je prethodni u upotrebi: malloc(): invalid next->prev_inuse (unsorted)
Ako je ovo uspelo, vrati deo i to je to, ako ne, nastavi sa izvršavanjem funkcije...
ako je veličina jednaka
Nastavi sa uklanjanjem dela iz kante, u slučaju da je tražena veličina tačno veličina dela:
Ako tcache nije popunjen, dodaj ga u tcache i nastavi da označavaš da postoji tcache deo koji se može koristiti
Ako je tcache pun, samo ga koristi vraćajući ga
_int_malloc ограничења
У овом тренутку, ако је неки део био сачуван у tcache-у који може да се користи и достигнута је граница, само врати tcache део.
Штавише, ако је достигнуто MAX_ITERS, прекини из петље и добиј део на други начин (top chunk).
Ако је return_cached био подешен, само врати део из tcache-а да избегнеш веће претраге.
Ako se ne pronađe odgovarajući deo za ovo, nastavite
Velika kesa (sledeća veća)
Ako u tačnoj velikoj kesi nije bilo nijednog dela koji bi mogao da se koristi, počnite da prolazite kroz sve sledeće velike kese (počinjajući od odmah veće) dok se ne pronađe jedan (ako ih ima).
Ostatak podeljenog dela se dodaje u neusortiranu kesu, last_reminder se ažurira i vrši se ista provera bezbednosti:
bck->fd-> bk != bck: malloc(): oštećeni neusortirani delovi2
sysmalloc
sysmalloc start
Ako je arena null ili je tražena veličina prevelika (i preostali mmaps su dozvoljeni), koristi sysmalloc_mmap za alokaciju prostora i vrati ga.
sysmalloc ne glavna arena
Prvo će pokušati da proširi prethodni heap za ovaj heap. Ako to nije moguće, pokušaće da alokira novi heap i ažurira pokazivače kako bi mogli da ga koriste.
Na kraju, ako to nije uspelo, pokušaće da pozove sysmalloc_mmap.
sysmalloc glavna arena prethodna greška 1
Ako je prethodno vraćeno MORECORE_FAILURE, pokušajte ponovo da alocirate memoriju koristeći sysmalloc_mmap_fallback
sysmalloc finale
Završite alokaciju ažuriranjem informacija o areni
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L2921C3-L2943C12if ((unsignedlong) av->system_mem > (unsignedlong) (av->max_system_mem))av->max_system_mem = av->system_mem;check_malloc_state (av);/* finally, do the allocation */p = av->top;size =chunksize (p);/* check that one of the above allocation paths succeeded */if ((unsignedlong) (size) >= (unsignedlong) (nb + MINSIZE)){remainder_size = size - nb;remainder =chunk_at_offset (p, nb);av->top = remainder;set_head (p, nb | PREV_INUSE | (av !=&main_arena ? NON_MAIN_ARENA :0));set_head (remainder, remainder_size | PREV_INUSE);check_malloced_chunk (av, p, nb);returnchunk2mem (p);}/* catch all failure paths */__set_errno (ENOMEM);return0;