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:

  1. przechodzi tablicę cache_sizes zatrzymując się na pierwszym elemencie csizep takim, że size >= csizep->cs_size.
  2. jeśli csizep->cs_size == 0, to funkcja kmalloc zwraca NULL
  3. jeśli flags & GFP_DMA == 0, wtedy niech cachep = csizep->cs_cachep, wpp. niech cachep = csizep->cs_dmacachep
  4. wynikiem kmalloc jest wynik kmem_cache_alloc(cachep, flags)

Funkcja kmem_cache_alloc działa tak:

  1. sprawdź, czy cachep->first_not_full wskazuje na cachep->slabs, jeśli tak, to przejdź do p. 5
  2. użyj tafli first_not_full: policz wskaźnik do alokowanego miejsca
  3. jeśli tafla się zapełniła, to przesuń wsk. first_not_null na nast. taflę
  4. zwróć policzony wskaźnik
  5. próbuj poszerzyć schowek o nowe tafle: jeśli się uda - przejdź to punktu 1, wpp. - zwróć NULL


© 2001 Łukasz Bolikowski, Jakub Górski, Jakub Kowalski, Janusz Kuligowski, Tomasz Szymko