Next: Zwolnienie pamięci
Up: Realizacja
Previous: Struktura opisu obszarów
  Spis rzeczy
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