参考linux内核修炼之道,自己的总结,水平有限,仅供参考
kmalloc是“为内核分配”内存的函数,分配的内存空间在物理上是连续的。而vmalloc是“为软件模块“使用的函数,分配的空间只需要在逻辑上连续(虚拟地址连续)。
这样做的意义是:物理上连续的空间,不需要通过MMU转化,所以“运行效率”高,内核级别的程序,通常很注重“运行效率”,因此需要连续空间。但是非内核级别的软件模块,消耗较大的内存,”运行效率“相对来说不重要,但是内存的“空间使用效率”相对重要,因此,它不要求物理地址连续,只需要虚拟地址连续。这就是为啥有了kmalloc(kernel malloc),还要vmalloc的原因。 因为vmalloc分配的是虚拟空间,因此其分配的空间会比较大。而kmalloc由于有物理地址大小的限制,很难分配较大的空间。
内核中用结构体vm_struct(include/linux/vmalloc.h)定义。struct vm_struct本身是一个链表,有成员变量struct vm_struct *next;
相比kmalloc,vmalloc还要建立专门的页表项,对不连续的内存块进行映射,因此分配效率低,容易造成TLB(Translation Lookaside Buffer)抖动。一般情况下内核都使用kmalloc,只有需要大块的内存时才使用vmalloc。