linux内存管理之malloc、kmalloc、kzalloc、vmalloc的区别
1 用户空间申请内存的方式
1.1 函数原型
void *malloc(unsigned int num_bytes);
1.2 函数解释和说明
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
1.3 释放函数
对应的释放函数是free();
2 内核空间申请内存的方式
2.1 kmalloc
2.1.1 函数原型
void *kmalloc(size_t size, gfp_t flags);
2.1.2 flags参数说明
1)GFP_KERNEL
内核内存分配时最常用的,无内存可用时可引起休眠,在中断上下文或持有自旋锁的时候不能使用 GFP_KERNE 申请内存 。
2)GFP_ATOMIC
用来从中断处理和进程上下文之外的其他代码中分配内存,从不睡眠,在中断处理函数、tasklet 和内核定时器等非进程上下文中不能阻塞,此时驱动应当使用 GFP_ATOMIC 标志来申请内存。当使用 GFP_ATOMIC 标志申请内存时,若不存在空闲页,则不等待,直接返回。
3)GFP_DMA
给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)
2.1.3 size参数说明
1)最小申请的内存大小为32字节或64字节(受系统影响)
2)最大申请的内存大小一般不超过128K(受系统影响)
3)kmalloc申请的内存在物理地址上是连续的,物理地址和虚拟地址之间存在一个固定偏移量;即虚拟内存的大小和物理内存的大小一样。
2.1.4 kmalloc函数作用
1)kmalloc是基于slab分配机制实现的
2)返回速度快(除非被阻塞)
3)分配的内存不进行任何初始化(清零)操作,分配的内存区域仍然保留有他原有的内容;
2.1.5 释放函数
void kfree(const void *objp);
2.1.6 linux源码解析
static __always_inline void *kmalloc(size_t size, gfp_t flags)
{
if (__builtin_constant_p(size)) { //用于编译器的优化,size是不是常量
if (size > KMALLOC_MAX_CACHE_SIZE) //用于确认最大开辟空间,该值为8K
//用于申请大内存,以page为粒度的申请,该函数最终调用的是alloc_pages函数,用的是伙伴系统
return kmalloc_large(size, flags);
#ifndef CONFIG_SLOB
if (!(flags & GFP_DMA)) {
int index = kmalloc_index(size);
if (!index)
return ZERO_SIZE_PTR;
//用于申请小内存,最后使用slab_slloc来完成
return kmem_cache_alloc_trace(kmalloc_caches[index],
flags, size);
}
#endif
}
return __kmalloc(size, flags);
}
2.2 kzalloc
2.2.1 函数原型
void *kzalloc(size_t size, gfp_t flags);
2.2.2 kzalloc函数说明
1)kzalloc()函数与 kmalloc()非常相似,参数及返回值一样
2)kzalloc()基于kmalloc实际上只是额外附加了 __GFP_ZERO 标志。所以它除了申请内核内存外,还会对申请到的内存内容清零
2.2.3 释放函数
释放函数仍然为void kfree(const void *objp);
2.3 valloc
2.3.1 函数原型
void *vmalloc(unsigned long size);
2.3.2 vmalloc函数说明
1)会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。
2)申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数
3)vmalloc() 和 vfree() 可以睡眠,因此不能从中断上下文调用。
2.3.2 释放函数
void vfree(const void *addr);
3 申请内存总结
3.1 相同点
1)用于申请内核空间的内存;
2)内存以字节为单位进行分配;
3)所分配的内存虚拟地址上连续;
4)都是基于slab机制
3.2 区别
1)kzalloc 是强制清零的 kmalloc 操作;(以下描述不区分 kmalloc 和 kzalloc)
2)kmalloc 分配的内存大小有限制(128K),而 vmalloc 没有限制;
3) kmalloc 可以保证分配的内存物理地址是连续的,但是 vmalloc 不能保证;
4) kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞;
5)kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快;
6)kmalloc 可以用于直接DMA传输
linux内存管理之malloc、kmalloc、kzalloc、vmalloc的区别的更多相关文章
- linux内存管理之malloc、vmalloc、kmalloc的区别
kmalloc kzalloc vmalloc malloc 和get_free_page()的区别 一.简述 1. kmalloc申请的是较小的连续的物理内存,虚拟地址上也是连续的.kmalloc和 ...
- Linux内存管理机制中buffer和cache的区别
Linux内存管理机制中buffer和cache的区别理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别. Fr ...
- Linux内存管理 (8)malloc
专题:Linux内存管理专题 关键词:malloc.brk.VMA.VM_LOCK.normal page.special page. 每章问答: malloc()函数是C函数库封装的一个核心函数,对 ...
- 内核空间内存申请函数kmalloc kzalloc vmalloc的区别
我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free().注意:动态申请的内存使用完后必须要释放,否则会造成内存 ...
- Linux内存管理 (6)vmalloc
专题:Linux内存管理专题 关键词:vmalloc.页对齐.虚拟地址连续.物理不连续 至此,已经介绍了集中内核中内存分配函数,在开始简单做个对比总结Linux中常用内存分配函数的异同点,然后重点介绍 ...
- Linux内存管理 - slab分配器和kmalloc
本文目的在于分析Linux内存管理机制的slab分配器.内核版本为2.6.31.1. SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了.前面讲过的伙伴系统只 ...
- Linux内存管理原理
本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
- Linux内存管理原理【转】
转自:http://www.cnblogs.com/zhaoyl/p/3695517.html 本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址 ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- linux内存管理子系统
一.Linux内存管理模型 1.虚拟地址与物理地址的映射 2.物理地址的分配二.虚拟地址与物理地址的映射 1.虚拟地址空间分布 32位处理器有32根地址总线,可访问4G的物理空间.其中有0-3G为用户 ...
随机推荐
- ASP.NET Core3.1 中使用MongoDB基本操作
1.安装驱动包 install-package MongoDB.Driver -version 2.11.7 2.配置文件帮助类 ConfigHelper public static class Co ...
- 苹果Macbook快捷键使用大全
苹果电脑Macbook快捷键如何使用?很多小伙伴经常询问小编有关于苹果电脑的相关问题,其实很多快捷键都可以提高生产力,那么接下来一起看看苹果Macbook快捷键使用大全! 苹果电脑Macbook快捷键 ...
- hdfs操作——hdfs的shell命令和hdfs的JavaAPI操作
hdfs解决hadoop海量数据的存储. shell 命令(所有hadoop fs 可由 hdfs dfs代替) (1) 在hdfs上创建目录 hadoop fs -mkdir 目录名 (2) 本地文 ...
- 【PDF】数理科学 2001年01月号 特集:「時間とは何か」- 時間が生んだ世界観とパラダイム -
书本详情 标题:数理科学 2001年01月号 特集:「時間とは何か」- 時間が生んだ世界観とパラダイム - | 数理科学編集部 | 年份:2001出版社:サイエンス社ISBN10:暂无信息5ISBN1 ...
- JavaScript基础知识整理(变量)
变量 ECMAScript变量有两种不同数据类型的值,分别是基本类型和引用类型,两者的不同在于基本类型值是简单的数据段,引用类型值一般指由多个值构成的对象 基本类型 基本数据类型包括5种:Undefi ...
- 删除Windows10资源管理器多余的入口
///// 删除3D对象 定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Nam ...
- 天龙八部<三联版>二
段誉来到无锡,遇上乔峰,斗气与乔峰比酒,乔峰误以为段誉是慕容复,段誉被乔峰豪气所折服,像乔峰坦言,乔峰不但不怒,反而对段誉很认可,二人结拜 段誉跟随乔峰来到丐帮,包不同和三女因为慕容复而和丐帮发生争执 ...
- c语言中的原子操作
参考文章:https://blog.csdn.net/yikai2009/article/details/8650221 1. 原子操作:原子操作指的是在执行过程中不会被别的代码所中断的操作..分为 ...
- Django基础篇 02- request常用属性和返回的响应类型、pycharm创建django项目
一.request常用属性 #django 请求对象里面的一些属性 print(request.method)#请求方式 print(request.body) #请求体 print(request. ...
- Vue中的样式穿透,修改element-ui组件样式不生效
在Vue项目中用的比较多的就是组件,为了实现组件的样式模块化.我们通常会在style标签中添加一个scoped属性,这样css样式只能作用于当前的Vue组件.使组件之间的样式相互独立,当调用该组件的时 ...