您的位置:首页 > 运维架构 > Linux

linux内核kmalloc与vmalloc的区别.

2017-03-21 11:49 218 查看
一.kmalloc():

用于申请较小的、连续的物理内存.

1. 以字节为单位进行分配,在<linux/slab.h>中

2. void *kmalloc(size_t size, int flags):分配的内存物理地址上连续,虚拟地址上自然连续

3. void kfree(const void *ptr):释放由kmalloc()分配出来的内存块

二.vmalloc():

用于申请较大的内存空间,虚拟内存是连续的

1. 以字节为单位进行分配,在<linux/vmalloc.h>中

2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续

3. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配 的内存上。

4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。

三.vmalloc()和kmalloc()区别

1.kmalloc保证分配的内存在物理上是连续的,那么它对应的虚拟内存肯定也是连续的,vmalloc保证的是在虚拟地址空间上的连续,但物理内存不一定连续.由于vmalloc()分配内存时,对应的物理内存是每个页框通过alloc_page()来分配.

2.kmalloc一般分配较小的内存,vmalloc分配较大的内存.

3.vmalloc比kmalloc要慢,且分配的虚拟地址空间位置不同.这两个函数所分配的内存虽然都处于内核空间(3GB~4GB),但对应的具体位置不同,kmalloc()分配的内存处于3GB~high_memory之间,而vmalloc()分配的内存在VMALLOC_START~VMALLOC_END之间,也就是非连续内存区。kmalloc分配的内存,它的物理地址与虚拟地址只有一个PAGE_OFFSET偏移,不需要为地址段修改页表,而vmalloc分配内存时需要修改主内核页表.

一般情况下在驱动程序中都是调用kmalloc()来给数据结构分配内存,而vmalloc()用在为活动的交换区分配数据结构,为某些I/O驱动程序分配缓冲区,或为模块分配空间,例如在include/asm-i386/module.h中定义了如下语句:

#define module_map(x) vmalloc(x)

其含义就是把模块映射到非连续的内存区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: