next up previous contents
Next: Zwolnienie pamięci Up: Realizacja Previous: Struktura opisu obszarów   Spis rzeczy

Przydział pamięci

To zdecydowanie najprostsza koncepcyjnie metoda przydziału (o ilę tylko oswoimy się z samym mechanizmem stronicowania). Również i funkcje ją realizujące są dość łatwe do przeanalizowania:
static inline void * vmalloc (unsigned long size)
{
   // prosimy o ramki najchętniej z wysokiej pamięci
  return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL);
}

void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
{
  void * addr;
  struct vm_struct *area;

  size = PAGE_ALIGN(size);   // wyrównanie do pełnych ramek
  if (!size || (size >> PAGE_SHIFT) > num_physpages) {
     BUG();           // nie mamy tyle pamięci !
     return NULL;
  }
   // poniżej funkcja `get_vm_area' tworzy nowy deskryptor obszaru, 
   // znajduje dla niego wolną przestrzeń adresową i zwraca adres.
  area = get_vm_area(size, VM_ALLOC); 
  if (!area)
     return NULL;
  addr = area->addr;
   // poniższa funkcja przydziela strony po jednej, odwołując się do systemu
   // bliźniaków i zmieniając globalny katalog stron.
  if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size,
                         gfp_mask, prot)) {
     vfree(addr);  // nie udało się - zwracamy deskryptor 
     return NULL;
  }
  return addr;
}


Adam Koprowski 2001-12-18