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); }