Systemy Operacyjne : Pamięć : Przydział pamięci na potrzeby jądra kmalloc
Łukasz Bolikowski
Oto nagłówki interesujących nas funkcji:
void * kmalloc (size_t size, int flags);
void * kmem_cache_alloc (kmem_cache_t *cachep, int flags);
Funkcja kmalloc działa następująco:
-
przechodzi tablicę cache_sizes zatrzymując się na pierwszym elemencie csizep takim, że
size >= csizep->cs_size.
-
jeśli csizep->cs_size == 0, to funkcja kmalloc zwraca NULL
-
jeśli flags & GFP_DMA == 0, wtedy niech cachep = csizep->cs_cachep, wpp.
niech cachep = csizep->cs_dmacachep
-
wynikiem kmalloc jest wynik kmem_cache_alloc(cachep, flags)
Funkcja kmem_cache_alloc działa tak:
-
sprawdź, czy cachep->first_not_full wskazuje na cachep->slabs, jeśli tak, to przejdź do p. 5
-
użyj tafli first_not_full: policz wskaźnik do alokowanego miejsca
-
jeśli tafla się zapełniła, to przesuń wsk. first_not_null na nast. taflę
-
zwróć policzony wskaźnik
-
próbuj poszerzyć schowek o nowe tafle: jeśli się uda - przejdź to punktu 1, wpp. - zwróć NULL
poprzednia strona |
spis treści |
następna strona
© 2001 Łukasz Bolikowski, Jakub Górski, Jakub Kowalski, Janusz Kuligowski, Tomasz Szymko