Kmalloc和Vmalloc的区别

kmalloc()和vmalloc()介绍
kmalloc()
用于申请较小的、连续的物理内存
1. 以字节为单位进行分配,在<linux/slab.h>中
2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续
3. gfp_mask标志
:什么时候使用哪种标志?如下:
———————————————————————————————-
情形 相应标志
———————————————————————————————-
进程上下文,可以睡眠 GFP_KERNEL
进程上下文,不可以睡眠 GFP_ATOMIC
中断处理程序 GFP_ATOMIC
软中断 GFP_ATOMIC
Tasklet GFP_ATOMIC
用于DMA的内存,可以睡眠 GFP_DMA | GFP_KERNEL
用于DMA的内存,不可以睡眠 GFP_DMA | GFP_ATOMIC
———————————————————————————————-
4. 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),这个函数可以睡眠,因此不能从中断上下文调用。

malloc(), vmalloc()和kmalloc()区别
[*]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
[*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)
[*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
[*]内存只有在要被DMA访问的时候才需要物理上连续
[*]vmalloc比kmalloc要慢

kmalloc()与vmalloc()的区别

   kmalloc()与vmalloc() 都是在内核代码中提供给其他子系统用来分配内存的函数,但二者有何区别?

   从前面的介绍已经看出,这两个函数所分配的内存都处于内核空间,即从3GB~4GB;但位置不同,kmalloc()分配的内存处于3GB~high_memory之间,而vmalloc()分配的内存在VMALLOC_START~4GB之间,也就是非连续内存区。一般情况下在驱动程序中都是调用kmalloc()来给数据结构分配内存,而vmalloc()用在为活动的交换区分配数据结构,为某些I/O驱动程序分配缓冲区,或为模块分配空间,例如在include/asm-i386/module.h中定义了如下语句:

  #define module_map(x)           vmalloc(x)

  其含义就是把模块映射到非连续的内存区。

 与kmalloc()和vmalloc()相对应,两个释放内存的函数为kfree()和vfree()。

kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续
kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
内存只有在要被DMA访问的时候才需要物理上连续
vmalloc比kmalloc要慢

1)kmalloc分配的物理地址与虚拟地址只有一个PAGE—OFFSET偏移,不需要为地址段修改页表。

Vmalloc类函数地址完全虚拟,每次分配都需要对页表进行设置,当然效率低。
2)vmalloc使用的正确场合是分配一大块,连续的,只在软件中存在的,用于缓冲的内存区域。不能在微处理器之外使用。
3)vmalloc 中调用了 kmalloc (GFP—KERNEL),因此也不能应用于原子上下文。

kmalloc和
kfree管理内核段内分配的内存,这是真实地址已知的实际物理内存块。vmalloc和vfree是对内核使用的虚拟内存进行分配和释放。
kmalloc返回的内存是物理的,连续的,更适合于类似设备驱动的程序来使用。但vmalloc能使用更多的资源,因为vmalloc还可以处理交换空
间。

kmalloc()分配的内存在0xBFFFFFFF-0xFFFFFFFF以上的内存中,driver一般是用它来完成对DS的分配
vmalloc()则是位于物理地址非连续,虚地址连续区,起始位置由VMALLOL_START来决定,一般作为交换区、模块的分配

kmalloc对应于kfree,可以分配连续的物理内存;
vmalloc对应于vfree,分配连续的虚拟内存,但是物理上不一定连续。

vmalloc分配内存的时候逻辑地址是连续的,但物理地址一般是不连续的,适用于那种一下需要分配大量内存的情况,如insert模块的时候。这种分配方式性能不入kmalloc。

kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好。物理地址和逻辑地址都是连续的

最主要的区别是

分配大小的问题。
比如你需要28个字节,那一定用KMALLOC,如果用VMALLOC,分配不多次机器就罢工了

原文地址:https://www.cnblogs.com/alantu2018/p/8444937.html

时间: 2024-09-28 08:22:25

Kmalloc和Vmalloc的区别的相关文章

内核空间内存申请函数kmalloc kzalloc vmalloc的区别

我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free().注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃.  那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc().kzalloc().vmalloc() 等,下面我们介绍一下这些函数的使用以及它们之间的区别. kmalloc: void *kmalloc(size_t size, gfp

Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别【转】

转自:http://www.th7.cn/system/lin/201606/167750.shtml 我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free().注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃. 那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc().kzalloc().vmalloc() 等,下面我们介绍一下这些函数的使

kmalloc、vmalloc、malloc的区别

简单的说: kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确) kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大 内存只有在要被DMA访问的时候才需要物理上连续 vmalloc比kmalloc要慢 详细的解释: 对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换

转:内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages

在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcalloc.get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理器而言,Linux提供了复杂的内存管理系统,使得进程所能访问到的地址空间可以达到4GB;而这4GB的空间又被划分为两个部分:0GB~3GB(PAGE_OFFSET,x86中的值是0xC0000000)的区域被用作进程的用户空间,3GB~4GB的区域被用作内核空间;在内核空间中,从3GB到vmallo

内存分配方法 kmalloc()、vmalloc()、__get_free_pages()

Copyright: 该文章版权由潘云登所有.可在非商业目的下任意传播和复制. 对于商业目的下对本文的任何行为需经作者同意. kmalloc #include <linux/slab.h> void *kmalloc(size_t size, int flags); void kfree(const void *ptr); 使用kmalloc可以获得以字节为单位的一块内核内存,它不对所获取的内存空间清零.这个函数返回一个指向内存块的指针,其内存块至少要有size大小.所分配的内存区在物理上是连

Memory Allocation API In Linux Kernel &amp;&amp; Linux Userspace、kmalloc vmalloc Difference、Kernel Large Section Memory Allocation

目录 1. 内核态(ring0)内存申请和用户态(ring3)内存申请 2. 内核态(ring0)内存申请:kmalloc/kfree.vmalloc/vfree 3. 用户态(ring3)内存申请:malloc/free 4. 内核内存申请原则 5. 内核中分配物理地址连续的大段内存 1. 内核态(ring0)内存申请和用户态(ring3)内存申请  0x1: 差异点 在内核中申请内存和在用户空间中申请内存不同,有以下因素引起了复杂性,包括 1. 内核的虚拟和物理地址被限制到1GB 2. 内核

Linux驱动经典面试题目

1.  linux驱动分类 2.  信号量与自旋锁 3.  platform总线设备及总线设备如何编写 4.  kmalloc和vmalloc的区别 5.  module_init的级别 6.  添加驱动 7.  IIC原理,总线框架,设备编写方法,i2c_msg 8.  kernel panic 9.  USB总线,USB传输种类,urb等 10.android boot 流程 11.android init解析init.rcLinux驱动经典面试题目,布布扣,bubuko.com

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

linux驱动面试题目汇总

http://blog.csdn.net/blueice8601/article/details/7666427 1.linux驱动分类 2.信号量与自旋锁 3.platform总线设备及总线设备如何编写 4.kmalloc和vmalloc的区别 5.module_init的级别 6.添加驱动 7.IIC原理,总线框架,设备编写方法,i2c_msg 8.kernel panic 9.USB总线,USB传输种类,urb等 10.android boot 流程 11.android init解析in