内存分配函数vmalloc,它是用来分配虚拟地址空间的连续区域的。尽管这段区域在物理上可能是不连续的(要访问其中的每个页面都必须独立调用函数alloc_page),内核却认为它们在地址上是连续的。vmalloc在发送错误时返回0(NULL地址),成功时返回一个指针,该指针指向一个线性的、大小最小为SIZE的线性内存区域。
vmalloc相关的内容定义在<linux/vmalloc.h>中。
vmalloc是Linux内存分配机制的基础。但是,在大多数情况下,不鼓励使用vmalloc。通过vmalloc获得的内存使用起来效率不高,而且在某些系统架构上,用于vmalloc的地址空间总量相对较小。如果可能,应该直接和单个页面打交道,而不是使用vmalloc。
主要的API:
void *vmalloc(unsigned long size);
void vfree(const void *addr);
其实,由kmalloc和__get_free_pages返回的内存地址也虚拟地址,其实际值任然要有MMU(内存管理单元,通常是CPU的组成部分)处理才能转为物理内存地址。vmalloc在如何使用硬件上没有区别,区别在于内核如何执行分配任务上。
kmalloc和__get_free_pages使用的(虚拟)地址范围与物理内存是一一对应的,可能会有基于常量PAGE_OFFSET的一个偏移。这两个函数不需要为该地址段修改页表。但,vmalloc使用的地址范围完全是虚拟的,每次分配都要通过也页表的适当设置来建立(虚拟)内存区域。
用vmalloc分配得到的地址是不能给微处理器之外使用的,因为它们只在处理器的内存管理单元上才有意义。当驱动程序需要真正的物理地址时(像外设用以驱动系统总线的DMA地址),就不能使用vmalloc了。使用vmalloc函数的正确场合是在分屏一大块连续的,只在软件中存在的、用于缓冲的内存区域的时候。注意,vmalloc的开销要比__get_free_pages大,因为它不但获取内存,还要建立页表。因此,用vmalloc函数分配仅仅一页的内存空间是不值得的。