kmalloc()和vmalloc()介绍

转载 2012年03月25日 19:13:27

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要慢

linux内存管理之malloc、vmalloc、kmalloc的区别

linux内存管理之malloc、vmalloc、kmalloc的区别 malloc的实现原理
  • fangjian1204
  • fangjian1204
  • 2014年10月02日 21:02
  • 2481

物理内存分配与回收(4)kmalloc 和 vmalloc

1.通用缓冲区       在内核中初始化开销不大的数据结构可以合用一个通用的缓冲区。通用缓冲区最小为32B,然后依次为64B,128B,。。。直至128KB(即32个页面),但是,对通用缓冲区的管理...
  • wrx1721267632
  • wrx1721267632
  • 2015年12月14日 15:29
  • 342

linux内存管理——kmalloc和vmalloc

直接映射区:线性空间中从3G开始最大896M的区间,为直接内存映射区,该区域的线性地址和物理地址存在线性转换关系:线性地址=3G+物理地址。 动态内存映射区:该区域由内核函数vmalloc来分配,特...
  • shixin_0125
  • shixin_0125
  • 2018年01月15日 20:32
  • 17

linux内存管理——kmalloc和vmalloc

进程的4GB内存空间被人为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。   内核...
  • yyf_it
  • yyf_it
  • 2016年09月23日 15:26
  • 177

kmalloc, vmalloc分配的内存结构

From: http://linux.chinaunix.net/techdoc/system/2008/06/16/1011365.shtml 对于提供了MMU(存储管理器,辅助操作系统进行内...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2013年03月12日 18:40
  • 1153

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

我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free()。注意:动态申请的内存使用完后必须要释放,否则会造成内存...
  • luckydarcy
  • luckydarcy
  • 2016年06月05日 12:15
  • 4912

Kmalloc内部实现:挖掘Linux内核内存分配(一)

为什么写这篇文章: 最近我在几个linux设备上发现整数溢出,以致我开始用kmalloc重写内存分配。 注意: 理解这篇文章需要知道点linux内核。有时候我肯能用熟知的一些函数名。如果你不...
  • boyhailong
  • boyhailong
  • 2014年04月06日 23:45
  • 1667

linux内存管理之malloc、vmalloc、kmalloc的区别

http://blog.csdn.net/fangjian1204/article/details/39738293 linux内存管理之malloc、vmalloc、kmalloc的区...
  • zdy0_2004
  • zdy0_2004
  • 2014年10月21日 16:41
  • 521

内核中的kmalloc函数详解

一、kmalloc函数详解  #include void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参数是要分配的块的大小. 第 2 个...
  • qq_29350001
  • qq_29350001
  • 2016年05月05日 15:02
  • 565

linux中kmalloc函数详解

kmalloc 是个功能强大且高速(除非被阻塞)的工具,所分配到的内存在物理内存中连续且保持原有的数据(不清零)。原型: #include linux/slab.h> void *kmalloc...
  • sonbai
  • sonbai
  • 2013年03月04日 19:56
  • 1576
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kmalloc()和vmalloc()介绍
举报原因:
原因补充:

(最多只允许输入30个字)