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

Linux内存管理 -内存申请与释放 内存分配与回收内核实现 阅读详情

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传输

kmallc、kzalloc、vmalloc使用 vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移。kzalloc是kmalloc的变种。GFP_ATOMIC:分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断; 阅读详情

相关推荐

Linux内存管理(43):vmalloc 详解

kmalloc()、vmalloc()、malloc() 这三个函数是常用的内存分配函数,但有着本质的区别。kmalloc()基于slab 分配器,是建立在一个物理地址连续的大内存块上,所以 kmalloc() 分配的内存物理是上连续的,而且 kmalloc() 映射的虚拟内存在线性区域,也是连续的。详细可以查看《slub 分配器之kmem_cache_alloc》一文第5.1.2节。相比于 kmalloc(),vmalloc()实现是为了虚拟内存连续,而物理内存可以不用连续。

私房菜 2010

kzalloc 函数详解

用kzalloc申请内存的时候, 效果等同于先是用 kmalloc() 申请空间 , 然后用 memset() 来初始化 ,所有申请的元素都被初始化为 0. /** * kzalloc - allocate memory. The memory is set to zer

J.A.Y的专栏 3万+

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1319

Linux内核内存分配函数kmalloc、kzalloc和vmalloc

内核内存分配函数kmalloc/kzalloc/vmalloc的对比和示例程序

weixin_40313940的博客 3454

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务,如果操作系统或者第三方软件没有及时升级打补丁,攻击者就有可能直接通过服务器上运行的服务进行攻击。

weixin_49349476的博客 1446

C# 实现文件和字符串的AES加密解密

C# 实现文件和字符串的AES128加密解密

m0_72044573的博客 5935

kmalloc vmalloc kzalloc malloc 和 get_free_page()

kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数 malloc是用户空间申请内存函数   一 ,kmalloc() 与 kfree()  和get_free_page的区别 1,用于申请较小的、连续的物理内存:使用的是内存分配器slab一小片。申请的内存位于物理内存的映射区域。其正真的物理地址只相差一个固定的偏移。    可以用这两

2505

模型参考自适应控制(MRAC):让PID参数动态优化

本文深入解析模型参考自适应控制(MRAC)技术,它通过实时调整PID参数,使控制系统能自动适应系统特性变化和外部干扰。文章详细介绍了MRAC的工作原理、数学基础,并提供了用C语言实现的实战代码示例,帮助工程师解决传统PID控制在非线性、时变系统中参数整定繁琐的难题。

tequila的博客 903

kmalloc vmalloc malloc get_free_page

kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数 malloc是用户空间申请内存函数 一 ,kmalloc() 与 kfree()  和get_free_page的区别 1,用于申请较小的、连续的物理内存:使用的是内存分配器slab一小片。申请的内存位于物理内存的映射区域。其正真的物理地址只相差一个固定的偏移。    可以用这两个

woaishuo2011的专栏 638

Avellaneda & Stoikov’s market-making strategy AS模型的通俗理解篇(一)

δa, δb = bid/ask spread, symmetrical → δa=δb 也就是一段时间内,这个midprice 上蹿下跳的幅度计算,其实做市也就是一种网格,或者说类似布林带,我们经过计算在底部放买单,在高点放一个卖单,如果上下都成交了,那么仓位不变,你把利差赚了。一般来说在震荡行情中,很适合做市,特别是波动率不高情况下,我们通过AS的经典论文得到2个最关键公式,下面来解读一下这个公式的含义,如何在hummingbot 策略中如何设置这些参数。如果单边上涨,你就无货可卖,俗称卖飞了。

weixin_42480337的博客 1万+

无刷电机里的霍尔传感器,和 AS5600 编码器到底有什么区别?

摘要: 无刷电机中的霍尔传感器主要用于换相控制,提供6种状态反馈,无法实现精确角度测量。与AS5600磁编码器(分辨率4096)相比,霍尔仅能确保电机“转得对”,而编码器则用于高精度角度反馈。在机器人等需要位置闭环的场景中,两者需协同使用:霍尔负责基础换相,编码器提供精确角度控制。简单应用中可仅用霍尔,但高精度定位必须搭配编码器。

qq_45430571的博客 242

linux内存管理之内存分配函数区别

malloc 、calloc、kmalloc、kzalloc、vmalloc、和get_free_page() 等区别 用户/内核 API名称 物理连续? 大小限制 单位 场景 用户空间 malloc/calloc/realloc/free 不保证 堆申请 字节 calloc初始化为0;realloc改变内存大小。 all...

夏天Alex 959

Vue3 - Arco Design Vue 表格组件 table 隐藏鼠标移入时 hover 高亮背景色,el-table 组件去除鼠标悬停在表格行的 hover 高亮效果(改变鼠标移入时的背景色)

vue3,arcodesignvue,arcodesign,表格,a-table,hover,表格hover的class类名是什么,class,hover,在arcodesignvue项目中,表格组件如何去掉鼠标移入时的hover效果,vue3arco.design表格组件修改鼠标移入行的背景颜色,table表格,取消表格行row移入高亮效果,去掉鼠标移入行时的hover效果,取消a-table的hover状态,取消高亮显示,隐藏表格鼠标hover效果,去除鼠标触摸变色效果,如何取消arco表

🏆 前端领域优质创作者 3773

kmalloc/kzalloc/vmalloc/malloc和get_free_page的区别

目录 1. 简述 2. linux内存分布图:​ 2.1 kmalloc 2.1.1 kmalloc和get_free_page申请内存方式 2.1.2 kmalloc的用法 3、kzalloc 4、vmalloc 5、kmalloc、get_free_page和vmalloc的区别: 6、用户空间申请内存malloc 1. 简述 kmalloc申请的是较小的连续的物理内存,...

yxtxiaotian的专栏 533

图像拼接——ITKMontage

ITKMontage是一个开源的、高性能的图像拼接软件模块。它的核心任务是将多张部分重叠的图像瓦片(Tiles)拼接成一幅完整的大图,专为处理材料显微科学中产生的大规模、高分辨率图像而设计。针对ITKMontage模块中示例进行了修改,解决了没有文件TileConfiguration.txt的情况,以及使用中的一些BUG。ITKMontage可以单独编译,也可以作为ITK的一个模块进行编译,介绍后一种的cmake设置。本文介绍使用ITKMontage模块进行图像拼接的方法。此处省略编译后的库配置。

2301_79131410的博客 100

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

malloc、kmalloc、kzalloc、vmalloc的区别

开发过linux应用程序的人都知道,在linux应用程序中,动态申请内存时用的函数是malloc(),malloc函数的原型是: malloc void *malloc(unsigned int num_bytes) 如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)

DSP小胖的博客 2934

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

kmalloc kzalloc vmalloc malloc 和get_free_page()的区别

一、简述 1、 kmalloc申请的是较小的连续的物理内存,虚拟地址上也是连续的。kmalloc和get_free_page最终调用实现是相同的,只不过在调用最终函数时所传的flag不同而已。除非被阻塞否则他执行的速度非常快,而且不对获得空间清零。 2、get_free_page()申请的内存是一整页,一页的大小一般是128K。 3、kzalloc 先是用 kmalloc() 申请空间 ,

不会游泳的鱼<。)#)))≦ 的专栏 5625

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

kmalloc、vmalloc、kmem_cache_alloc的区别

kmalloc和vmalloc的区别 kmalloc: kmalloc

qq_35399548的博客 3838

Linux内存分配函数kmalloc、kzalloc、vmalloc、get_free_pages、malloc的区别

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

alimingh的博客 1872

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

kmalloc kzalloc vmalloc malloc 和get_free_page()的区别 一、简述 1、 kmalloc申请的是较小的连续的物理内存,虚拟地址上也是连续的。kmalloc和get_free_page最终调用实现是相同的,只不过在调用最终函数时所传的flag不同而已。除非被阻塞否则他执行的速度非常快,而且不对获得空间清零。 2、get_free_page()申请的内存是一...

weixin_33862041的博客 647

用户态与内核态内存申请有何不同?从malloc到kmalloc的物理内存分配时机

内存管理是操作系统底层核心,区分虚拟内存与物理内存对排查性能问题至关重要。用户态通过malloc申请内存时,内核通常只建立虚拟地址映射,物理页要等到程序首次访问时通过缺页中断触发分配,因此初始不会消耗物理内存。内核态的kmalloc则直接走slab分配器从伙伴系统获得物理页,调用返回前就已占用内存。理解缺页中断、页表映射和伙伴系统的工作原理,有助于定位内存占用问题,并优化大块内存分配策略。在实际工程中,可通过VmRSS观测用户态实际驻留内存,或用slabtop排查内核态分配异常,合理选择malloc、mma

weixin_33895657的博客 457
上一篇: FFmpeg的makefile逻辑分析
下一篇: Linux内核malloc()背后的实现原理——内存池
江太翁
博客等级 码龄15年 271粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值