Linux驱动编程 - kmalloc、vmalloc区别

news2024/11/22 14:21:19

目录

 

前言:

1、区别

2、使用差异

一、kmalloc、kzalloc、kfree

1、动态申请

1.1 kmalloc()

1.2 kzalloc()

2、内存释放

3、示例

二、vmalloc、vzalloc、vfree

1、动态申请

1.1 vmalloc()

1.2 vzalloc()

2、内存释放

3、示例


前言:


        Linux内核空间一般使用 kmalloc()、kzalloc()、vmalloc() 、vzalloc() 动态申请内存。下面记录如何使用。


1、区别


  • vmalloc从高端内存开始分配,当内存不够时才分配低端内存。kmalloc从低端内存开始分配;
  • vmalloc和kmalloc分配的虚拟地址都是连续的,但是vmalloc分配的物理地址一般不连续,kmalloc分配的物理地址连续
  • vmalloc分配的一般是大块的内存,而kmalloc一般分配的是小块内存(不超过128k);
函数位置特性大小限制
kmalloc低端内存(线性映射)区域物理地址虚拟地址均连续不能超过128K
kzalloc低端内存(线性映射)区域物理地址虚拟地址均连续不能超过128K
vmalloc高端内存(动态映射)区域虚拟地址连续,物理地址不一定连续无限制
vzalloc高端内存(动态映射)区域虚拟地址连续,物理地址不一定连续无限制

2、使用差异


  • kmalloc 分配内存的过程可以是原子过程(使用 GFP_ATOMIC),而 vmalloc 分配内存时则可能产生阻塞;
  • kmalloc 分配内存的开销小,因此 kmalloc 比 vmalloc 要快;

注意:一般情况下,内存只有在要被 DMA 访问的时候才需要物理上连续,但为了性能上的考虑,内核中一般使用 kmalloc(),而只有在需要获得大块内存时才使用 vmalloc()。例如,当模块被动态加载到内核当中时,就把模块装载到由 vmalloc() 分配的内存上。

一、kmalloc、kzalloc、kfree


1、动态申请


1.1 kmalloc()

/* include/linux/slab.h */
void *kmalloc(size_t size, gfp_t flags);

功能: kmalloc() 申请的内存位于物理内存映射(低端内存)区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB

参数:

  • size:申请内存大小
  • flags:分配标志

       (1)flags 常用值

GFP_ATOMIC分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断
GFP_KERNEL正常分配内存
GFP_DMA给 DMA 控制器分配内存,需要使用该标志(DMA要求分配虚拟地址和物理地址连续)

        (2)flags 用法

​ |– 进程上下文,可以睡眠     GFP_KERNEL
 |– 进程上下文,不可以睡眠    GFP_ATOMIC
 |  |– 中断处理程序       GFP_ATOMIC
 |  |– 软中断          GFP_ATOMIC
 |  |– Tasklet         GFP_ATOMIC
 |– 用于DMA的内存,可以睡眠   GFP_DMA | GFP_KERNEL
 |– 用于DMA的内存,不可以睡眠  GFP_DMA | GFP_ATOMIC

        如果进程上下文允许睡眠情况下尽量用 GFP_KERNEL, 如果进程上下文禁止休眠的话(如中断,taskletd等)必须用 GFP_ATOMIC

返回值:

  • 非NULL:申请到的内存虚拟地址(指向一块物理上连续的内存区域);
  • NULL:申请失败;

1.2 kzalloc()

kzalloc() 函数与 kmalloc() 非常相似,参数及返回值是一样的。kzalloc() 实际上只是额外附加了__GFP_ZERO标志。所以它除了申请内核内存外,还会对申请到的内存内容清零。

/* include/linux/slab.h */
static inline void *kzalloc(size_t size, gfp_t flags)
{
	return kmalloc(size, flags | __GFP_ZERO);
}

2、内存释放


kmalloc() 和 kzalloc() 的内存释放函数都是 kfree()

/* mm/slob.c */
void kfree(const void *objp);

参数:

  • objp:kmalloc() 和 kzalloc() 申请的内存首地址

3、示例


/* 申请内存 */
pBuffer = kmalloc(1024, GFP_KERNEL);
if (!pBuffer) {
    printk(KERN_ERR "kmalloc failed\n");
    return -1;
}


/* 释放内存 */
kfree(pBuffer);

二、vmalloc、vzalloc、vfree


注意:vmalloc和vfree可以休眠,因此中断上下文禁止使用

1、动态申请


1.1 vmalloc()

/* mm/vmalloc.c */
void *vmalloc(unsigned long size)
{
	return __vmalloc_node_flags(size, NUMA_NO_NODE,
				    GFP_KERNEL);
}

功能:vmalloc() 函数则会在虚拟内存(高端内存)区域给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

参数:

  • size:申请内存的大小

返回值:

  • 非NULL:申请到的内存的虚拟地址;
  • NULL:申请失败;

1.2 vzalloc()

vzalloc比vmalloc步骤多了一步,将申请的逻辑地址连续的内存数据置为0

/* mm/vmalloc.c */
void *vzalloc(unsigned long size)
{
  	return __vmalloc_node_flags(size, NUMA_NO_NODE,
  				GFP_KERNEL | __GFP_ZERO);
}

2、内存释放


vmalloc() 和 vzalloc() 的内存释放函数都是 vfree()

void vfree(const void *addr);

3、示例


/* 申请内存 */
pBuffer = vmalloc(1024);
if (!pBuffer ) {
    printk(KERN_ERR "vmalloc failed\n");
    return -1;
}

/* 释放内存 */
vfree(pBuffer);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用低成本的蓝牙HID硬件模拟鼠标和键盘来实现自动化脚本

做过自动化脚本的都知道,现在很多传统的自动化脚本方案几乎都可以被检测,比如基于root,adb等方案。用外置的带有鼠标和键盘功能集的蓝牙HID硬件来直接点击和滑动是非常靠谱的方案,也是未来的趋势所在。 一、使用蓝牙HID硬件的优势…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具,它结合了深度学习和机器学习技术,为用户提供了便捷的视频制作和编辑体验。 系统:Ubuntu22.04系统,显卡:4090,显存:24G 二、基础…

#渗透测试#SRC漏洞挖掘#Python自动化脚本的编写05之多线程与多进程

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

C++多继承:一个子类继承多个父类的情况

C的类继承大家还算比较了解。它主要包括单继承、多继承、虚继承这几方面。 单继承就是一个子类只继承一个父类,多继承就是一个子类继承多个父类。 其实在C中,一个子类继承多个父类的情况还是比较常见的。比如,一个子类需要同时继承两个父类…

在windows电脑上安装docker服务

以下是在 Windows 电脑上安装 Docker 服务的详细步骤: 一、下载 Docker Desktop for Windows 系统要求:Windows 操作系统需要是 Windows 10(64 位)专业版、企业版或教育版,或者是 Windows 11。并且系统要开启了硬件虚…

单片机UART协议相关知识

概念 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器) 是一种 异步 串行 全双工 通信协议,用于设备一对一进行数据传输,只需要两根线(TX,RX)。 异步&…

XXL-JOB执行任务的SpringBoot程序无法注册到调度中心

文章目录 1. 问题呈现2. 问题产生的原因2.1 原因一:执行器和调度中心部署在不同的机器上2.2 原因二:调度中心部署在云服务器上 3. 解决方法3.1 方法一:将执行器和调度中心部署在同一台机器上3.2 方法二:手动指定执行器的ip地址&am…

Ettus USRP X410

总线连接器: 以太网 RF频率范围: 1 MHz 至 7.2 GHz GPSDO: 是 输出通道数量: 4 RF收发仪瞬时带宽: 400 MHz 输入通道数量: 4 FPGA: Zynq US RFSoC (ZU28DR) 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 Ettus USRP X410集…

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据(Schema Markup)8. 内链与外链9. 社交分享 哋它亢SEO…

将网站地址改成https地址需要哪些材料

HTTPS(安全超文本传输协议)是HTTP协议的扩展。它大大降低了个人数据(用户名、密码、银行卡号等)被拦截的风险,还有助于防止加载网站时的内容替换,包括广告替换。 在发送数据之前,信息会使用SSL…

mongodb多表查询,五个表查询

需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…

端到端的专线管理与运维:实时掌握专线的运行状态

在当今高度信息化的时代,专线服务已成为企业数据传输的重要组成部分。为了确保专线服务的高效、稳定运行,我们采用了先进的端到端管理模式,对专线的运行状态和质量进行全面监控。本文将从专线管理的必要性、端到端管理模式的优势、实施步骤以…

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景:后端发送邮件需要时间,前端若响应不动会导致体验感不佳,一般会采用多线程的方式去处理这些任务,但每次都需要自己去手动编写多线程来实现 1、编写servic…

PostgreSQL常用字符串函数与示例说明

文章目录 coalesce字符串位置(position strpos)字符串长度与大小写转换去掉空格(trim ltrim rtrim)字符串连接(concat)字符串替换简单替换(replace)替换指定位置长度(overlay)正则替换(regexp_replace) 字符串匹配字符串拆分split_part(拆分数组取指定位置的值)string_to_array…

深入剖析Java内存管理:机制、优化与最佳实践

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 深入剖析Java内存管理:机制、优化与最佳实践 一、Java内存模型概述 1. Java内存模型的定义与作…

【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击

基本信息 原文标题:ROBUSTKV: DEFENDING LARGE LANGUAGE MODELS AGAINST JAILBREAK ATTACKS VIA KV EVICTION 原文作者:Tanqiu Jiang, Zian Wang, Jiacheng Liang, Changjiang Li, Yuhui Wang, Ting Wang 作者单位:Stony Brook University…

css使用弹性盒,让每个子元素平均等分父元素的4/1大小

css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…

图像处理 之 凸包和最小外围轮廓生成

“ 最小包围轮廓之美” 一起来欣赏图形之美~ 1.原始图片 男人牵着机器狗 2.轮廓提取 轮廓提取 3.最小包围轮廓 最小包围轮廓 4.凸包 凸包 5.凸包和最小包围轮廓的合照 凸包和最小包围轮廓的合照 上述图片中凸包、最小外围轮廓效果为作者实现算法生成。 图形几何之美系列&#…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

【论文阅读】Poison Forensics: Traceback of Data Poisoning Attacks in Neural Networks

Poison Forensics: Traceback of Data Poisoning Attacks in Neural Networks 核心原理前提条件方法第一个问题第二个问题 核心原理 有毒样本会使模型更接近参数空间中的最佳位置,良性样本会使该模型向其随机初始化状态移动 前提条件 最重要的: 可以…