next up previous contents
Next: Literatura Up: Realizacja Previous: Przydział pamięci   Spis rzeczy

Zwolnienie pamięci

Tu również nie znajdziemy niczego zaskakującego.
void vfree(void * addr)
{
   struct vm_struct **p, *tmp;

   if (!addr)   // pusty adres ?
      return;
   if ((PAGE_SIZE-1) & (unsigned long) addr) {
       // adres nie zaczyna się na początku strony !
      printk(KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
      return;
   }
   write_lock(&vmlist_lock);  // blokada
    // przeszukujemy listę obszarów w poszukiwaniu `pasującego'
   for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
      if (tmp->addr == addr) {
         *p = tmp->next;
	  // zwolnienie zaalokowanych stron i zmienia globalne tablice stron
         vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
         write_unlock(&vmlist_lock);
         kfree(tmp);  // zwolnienie deskryptora obszaru
         return;
      }
  }
  write_unlock(&vmlist_lock);
   // ooops... brak pasującego obszaru ? - coś nie tak
  printk(KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", addr);
}



Adam Koprowski 2001-12-18