内核中的内存申请:kmalloc、vmalloc、kzalloc、get_free_pages 之间的区别
kmalloc vmalloc kzalloc get_free_page()是内核空间申请内存空间函数
malloc是用户空间申请内存函数
一 ,kmalloc() 与 kfree() 和get_free_page的区别
1,用于申请较小的、连续的物理内存:使用的是内存分配器slab一小片。申请的内存位于物理内存的映射区域。其正真的物理地址只相差一个固定的偏移。
可以用这两个宏来简单转换 __pa(address) {virt_to_phys()} 和 __va(address){phys_to_virt()}
get_free_page()申请的内存是一整页,一页的大小一般是128K。它们的区别只有这一点不同,其它的都相同。
本质上讲,kmalloc()和get_free_page()最终调用实现都是相同的,只不过在调用最终函数时所传的flag不同而以。
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() 与 vfree()
用于申请较大的内存空间,虚拟内存是连续的:申请内存位于vmalloc_start -----vmalloc_end之间,与物理内存没有简单的转换关系。物理上不要求连续。
1. 以字节为单位进行分配,在<linux/vmalloc.h>中
2. void *vmalloc(unsigned long size) 分配的内存虚拟地址上连续,物理地址不连续
3. 一般情况下,只有硬件设备才需要物理地址连续的内存,因为硬件设备往往存在于MMU之外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用kmalloc(),而只有在需要获得大块内存时才使用vmalloc(),例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc()分配的内存上。
4.void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。
三,malloc(), vmalloc()和kmalloc()区别
[1]kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
[2]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc和vmalloc一样,也是虚连,物理不一定连。
[3]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
[4]内存只有在要被DMA访问的时候才需要物理上连续
[5]vmalloc比kmalloc要慢
四,kzalloc
kzalloc实现了kmalloc以及memset的功能,一个函数起到了两个函数的作用
这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么做 , 先是用 kmalloc() 申请空间 , 然后用memset() 来初始化 , 而现在省事了 , 一步到位 , 直接调用kzalloc(), 效果等同于原来那两个函数 , 所有申请的元素都被初始化为 0. 其实对写驱动的来说 , 知道现在应该用 kzalloc() 代替原来的 kmalloc() 和 memset() 就可以了 , 这是内核中内存管理部分做出的改变 , 确切的说是改进 , 负责内存管理那部分的兄弟们的目标无非就是让内核跑起来更快一些 , 而从 kmalloc/memset 到kzalloc 的改变确实也是为了实现这方面的优化.
五,目前kzalloc将取代kmalloc和memset功能。
以后在内核,看到此函数的比率将会更高。
转载于:https://www.cnblogs.com/alan666/p/8312357.html
内核中的内存申请:kmalloc、vmalloc、kzalloc、get_free_pages 之间的区别相关推荐
- 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】
转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...
- linux 内核申请内存大小,linux内核常用的内存申请函数
在读驱动程序时,常遇到内存申请函数.驱动程序属于内核空间,和用户空间用到的内存申请函数不同. 内核空间最常用到的内存申请函数为kmalloc()和kzalloc(). kmalloc()是申请一段内存 ...
- linux内核函数kmalloc,LINUX内核内存管理kmalloc,vmalloc
在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmallo ...
- Linux内核中常见内存分配函数
1. 原理说明 Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示.四级页表分 ...
- Linux内核中的内存管理(图例解析)
一 ,内核管理内存的方式 (1)内核把物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理,所以,从虚拟内存角度来看,页就是最小单位. 大多数32位系统支持4kb的页,64位系统支持8kb ...
- [十月往昔]——Linux内核中的内存管理浅谈
为什么要叫做"十月往昔"呢,是为了纪念我的原博客,http://www.casual0402.cn. 不知道为什么,突然想来一个新的开始--而那个博客存活至今刚好十个月,也有十个月 ...
- Linux内核中使用内存检测
目录 一.slub内存检测 1.越界访问 2.释放后再访问 3.无效的释放 4.实验输出 二.KASAN 内存检测 1.数组越界 2.栈的越界访问 3.实验输出 一般的内存访问错误如下: 越界访问 访 ...
- Linux内核中的内存屏障(转)
转自:http://www.linuxidc.com/Linux/2011-10/44623.htm 前言 之前读了关于顺序一致性和缓存一致性讨论的文章,感觉豁然开朗.对linux内核中出现的种种同步 ...
- KSM(Kernel Samepage Merging) 剖析:Linux 内核中的内存去耦合
简介:作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging) 允许这个系统管理程序通过 ...
最新文章
- dataframe,python,numpy 问题索引2
- window 10系统更改默认下载的位置
- 10行Python代码自动清理电脑内重复文件,释放双手!
- 读取oracle注释
- 字段中存在空值的问题测试
- 如何使用 Docker 部署一个基于 Play Framework 的 Scala Web 应用?
- Amazon DynamoDB 概览
- 非规范SQL的sharding-jdbc实践
- LoRa无线网络技术概述
- Springboot之QueryDSL增强JPA操作
- 类似微信朋友圈评论回复功能表设计、代码实现
- wps linux2019特色功能,WPS Office 2019 For Linux更新至11.1.0.9522版,附新功能介绍
- 差分编码 matlab,差分编码FSK调制解调matlab源程序.doc
- 计算机格式化命令符号,格式化c盘命令是什么 格式化c盘会怎么样【图文】
- 面试官:兄弟,说说基本类型和包装类型的区别吧
- 数据分析-PART1--数据获取和步骤
- 天池大赛 xgboost/lightgbm + python36 + win10_64 环境配置
- 福建土楼ppt计算机二级,福建土楼PPT.ppt
- 苹果和Android用点应用对比是真的吗,苹果手机与安卓手机相比,真的是苹果手机完胜吗...
- 在Linux平台上搭建EasyDarwin,编译代码并简单部署
热门文章
- 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
- Apollo进阶课程 ⑥ | 高精地图与自动驾驶的关系
- java 自定义xml_6.1 如何在spring中自定义xml标签
- 计算机网络技术基础教学内容,计算机网络技术基础
- mysql外键教程_关于MySQL外键的简单学习教程
- 刚学计算机先学什么好,计算机语言入门先学什么?
- 通达信板块监控指标_通达信洞察强势板块指标公式
- C++(STL):26 ---关联式容器set用法
- C++:07---this指针
- 《Python Cookbook 3rd》笔记(4.16):迭代器代替 while 无限循环