It is preferable when dealing with large amounts of memory to use physically contiguous physical pages in memory both for cache related and memory access latency issues. Unfortunately, due to external fragmentation problems with the buddy allocator, this is not always possible. Linux provides a mechanism via vmalloc where non-contiguous physically memory can be used that is contiguous in virtually memory.
The region to be allocated must be a multiple of the hardware page size and requires altering the kernel page tables and there is a limitation on how much memory can be mapped with vmalloc() because only the upper region of memory after PAGE_OFFSET is available for the kernel (1GB on an x86). As a result, it is used sparingly in the core kernel. In 2.4.20, it is only used for storing swap map information and for loading kernel modules into memory.