linux kmalloc与vmalloc区别

参考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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值