【Linux】内核空间动态内存申请

在这里插入图片描述

🔥博客主页:PannLZ

😘欢迎关注:👍点赞🙌收藏✍️留言

文章目录

    • 内核空间动态内存申请
      • 1.kmalloc()
      • 2._ _get_free_pages()
      • 3.vmalloc()


内核空间动态内存申请

1.kmalloc()

#include <linux/slab.h>

void *kmalloc(size_t size, int flags);

参数:

  1. 分配的块的大小
  2. 分配标志,用于控制kmalloc的行为。

最常用的分配标志是GFP_KERNEL,其含义是在内核空间的进程中申请内存。kmalloc()的底层依赖于 __get_free_pages()来实现,分配标志的前缀GFP正 好是这个底层函数的缩写。使用GFP_KERNEL标志申请 内存时,若暂时不能满足,则进程会睡眠等待页,即 会引起阻塞,因此不能在中断上下文或持有自旋锁的 时候使用GFP_KERNE申请内存。

其他一些申请标志:

GFP_USER用来为用户空 间页分配内存,可能阻塞
GFP_HIGHUSER类似 GFP_USER,但是它从高端内存分配
GFP_DMA从 DMA区域分配内存
GFP_NOIO不允许任何I/O初始 化
GFP_NOFS不允许进行任何文件系统调用
__GFP_HIGHMEM指示分配的内存可以位于高端内 存
__GFP_COLD请求一个较长时间不访问的 页
__GFP_NOWARN当一个分配无法满足时,阻止 内核发出警告
__GFP_HIGH高优先级请求,允许 获得被内核保留给紧急状况使用的最后的内存页
__GFP_REPEAT分配失败,则尽力重复尝试
__GFP_NOFAIL标志只许申请成功,不推荐
__GFP_NORETRY若申请不到,则立即放弃

kzalloc()

kzalloc()函数在本质上就是 kmalloc() 函数,只不过多了一个自动帮我们把所申请到的内存清零的操作而已。

kcalloc()

kcalloc()函数的本质也是 kmalloc() 函数。它相较于 kzalloc() 函数又多了一层“数量”的封装。

/**
 * kcalloc - allocate memory for an array. The memory is set to zero.
 * @n: number of elements.
 * @size: element size.
 * @flags: the type of memory to allocate (see kmalloc).
 */
static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
{
    return kmalloc_array(n, size, flags | __GFP_ZERO);
}
static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)
{
    if (size != 0 && n > SIZE_MAX / size)
        return NULL;
    return __kmalloc(n * size, flags);
}

使用上面三个函数申请的内存都应使用kfree()释 放,这个函数的用法和用户空间的free()类似

2._ _get_free_pages()

_ _get_free_pages()系列函数/宏是 kmalloc()实现的基础,_ _get_free_pages()系列函数/宏包括 get_zeroed_page()__get_free_page()_ _get_free_pages()

get_zeroed_page(unsigned int flags); //该函数返回一个指向新页的指针并且将该页清零。
__get_free_page(unsigned int flags); 
//该宏返回一个指向新页的指针但是该页不清零,它实际上为:
#define __get_free_page(gfp_mask) \
__get_free_pages((gfp_mask),0)  
//就是调用了下面的__get_free_pages()申请1页。

__get_free_pages(unsigned int flags, unsigned int order); 
/*该函数可分配多个页并返回分配内存的首地址,分配的页数为 2^order,分配的页也不清零。order 允许的最大值是 10(即 1024 页)或者 11(即2048 页),依赖于具体的硬件平台。*/

__get_free_pages()和get_zeroed_page()在 实现中调用了alloc_pages()函数, alloc_pages()既可以在内核空间分配,也可以在用 户空间分配,其原型为:

struct page * alloc_pages(int gfp_mask, unsigned long order);
/*参数含义与__get_free_pages()类似,但它返
回分配的第一个页的描述符而非首地址。*/

使用_ _get_free_pages()系列函数/宏申请的内存应使用下列函数释放:

void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);

__get_free_pages等函数在使用时,其申请标志 的值与kmalloc()完全一样,各标志的含义也与 kmalloc()完全一致,最常用的是GFP_KERNELGFP_ATOMIC

3.vmalloc()

vmalloc()一般用在为只存在于软件中(没有对应的硬件意义,因为分配的内存区域在物理内存中可能是分散的,而不是一个连续的物理内存块)的较大的顺序缓冲区分配内存,开销远大于__get_free_pages(),为了完成 vmalloc(),新的页表需要被建立。因此,只是调用 vmalloc()来分配少量的内存(如 1 页)是不妥的。
vmalloc()申请的内存应使用 vfree()释放,vmalloc()和 vfree()的函数原型如下:

void *vmalloc(unsigned long size);
void vfree(void * addr);

vmalloc()不能用在原子上下文中,因为它的内 部实现使用了标志为GFP_KERNELkmalloc()

使用vmalloc()函数的一个例子函数是 create_module()系统调用,它利用vmalloc()函 数来获取被创建模块需要的内存空间。

vmalloc()在申请内存时,会进行内存的映射, 改变页表项,不像kmalloc()实际用的是开机过程中 就映射好的DMA和常规区域的页表项。因此 vmalloc()的虚拟地址和物理地址不是一个简单的线 性映射。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask项目中使用蓝湖实现启动项配置——多个controller项

项目结构 # controller1-__init__.py from flask import Blueprintcont2_sale_blueprint Blueprint(cont2_sale_blueprint, __name__) cont2_user_blueprint Blueprint(cont2_user_blueprint, __name__) from . import user_controller from . import sale_controller# contr…

推荐一款很不错的vscode高亮插件

用过很多款高亮插件&#xff0c;总感觉大部分显示都很乱&#xff0c;但是其中有一款用起来很清晰明了&#xff0c;很喜欢&#xff01; 插件名字&#xff1a;select-highlight-cochineal-color 使用效果&#xff1a; 底色高亮让人感觉很清晰&#xff0c;一个好的高亮插件能让你…

VScode通过ssh连接github

通过ssh连接github 1.生成公钥和私钥2.设置config文件3.配置ssh免密登录4.远程仓库初始化 1.生成公钥和私钥 首先选择一个文件夹&#xff0c;右击 git bash here&#xff0c;在命令行输入命令&#xff0c;按下三次回车生成一个**.ssh文件夹**&#xff0c;一般在用户的user根目…

Django信号

一、介绍 Django有一个“信号调度器(signal dispatcher)”,当框架中的其他地方发生操作时,它可以通知一些解耦的应用程序 官网:信号 | Django 文档 | Django 1.1、内置的信号的使用 1.1.1、定义接收器函数 def my_callback(sender, **kwargs):print("Request finis…

【Linux】/proc文件系统

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

【回溯专题part1】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【已更新完成】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

通过Anaconda安装Python会得到的重要文件夹

E:\Anaconda\路径下 Scripts 文件夹&#xff1a;该文件夹包含了可执行的Python脚本文件&#xff0c;例如pip和conda等命令行工具。【pip3.exe和django-admin.exe等】Lib 文件夹&#xff1a;该文件夹包含了Python的标准库和其他第三方库的源代码文件。【Lib下面的site-packages…

农业四情监测系统的工作原理

农业四情监测系统的工作原理【TH-Q1】农业四情监测系统是一种应用现代科技手段&#xff0c;以实现对农田环境信息的实时监测和数据采集的系统。这一系统通过对农田的土壤、气象、病虫害以及作物生长状况等四个方面的实时监测&#xff0c;帮助农民和农业管理者更好地了解和掌握农…

力扣● 503.下一个更大元素II ● 42. 接雨水

503.下一个更大元素II 与496.下一个更大元素 I的不同是要循环地搜索元素的下一个更大的数。那么主要是对于遍历结束后&#xff0c;单调栈里面剩下的那些元素。 如果直接把两个数组拼接在一起&#xff0c;然后使用单调栈求下一个最大值就可以。 代码实现的话&#xff0c;不用直…

电脑笔记软件与桌面备忘录的高效设置指南

在数字化生活的大潮中&#xff0c;电脑笔记软件和桌面备忘录已成为我们日常信息管理与时间规划的重要载体。它们犹如你的私人智囊团&#xff0c;随时随地帮你记录灵感、整理思路、规划任务。本文将深度解析电脑笔记软件的多元功能&#xff0c;并手把手教你如何设置实用的电脑桌…

Kotlin函数进阶玩法

公众号「稀有猿诉」 原文链接 More about Kotlin Functions Kotlin中的函数是一级对象&#xff0c;除了常规的函数式编程以外&#xff0c;还支持一些非常灵活的特殊用法&#xff0c;可以大大增强代码的可读性和简洁性&#xff0c;让代码更加的优雅&#xff0c;在业界顶级…

第6讲-MIPS处理器(3)MIPS单周期处理器设计

三. MIPS单周期处理器设计 1.单周期数据通路设计 2.单周期控制器设计 3.单周期性能分析

阿里云服务器ECS经济型e实例2核2G优惠价格99元一年性能测试

阿里云服务器99元一年配置为云服务器ECS经济型e实例&#xff0c;2核2G配置、3M固定带宽和40G ESSD Entry系统盘&#xff0c;新用户和老用户均可买&#xff0c;续费不涨价依旧是99元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云99元服务器性能测评&#xff…

碳素光线疗法——动,植物 光育实验

碳素光线疗法——动&#xff0c;植物 光育实验 碳素光线疗法&#xff1a; 中西医、民间疗法融为一体&#xff0c;提高机体自身治愈力&#xff0c;免疫力&#xff0c;改善体质和保持健康&#xff0c;有助于疾病的预防和治疗的疗法。不吃药、不打针、不手术也能得健康&#xff0c…

HCIP的学习(3)

网络类型及数据链路层协议 网络类型分类 P2P网络----点到点网络类型MA网络-----多点接入网络 BMA----广播型多点接入网络NBMA—非广播型多点接入网络&#xff08;快淘汰了&#xff09; 数据链路层协议 MA网络 以太网协议 特点&#xff1a;需要使用MAC地址对设备进行区分…

经济事件对我们投资没影响吗?昂首资本的这两个实例说明白再说

各位投资者现在还不明白经济事件对我们投资的影响吗&#xff1f;下面昂首资本就通过两个实例&#xff0c;各位投资者能否明白经济事件对我们投资的影响。 2015年6月4日&#xff0c;澳大利亚零售量新闻发布。分析师预计销量增幅高达0.4%&#xff0c;但是结果却大吃一惊&#xf…

第四百一十七回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

【代码学习】Mediapipe人脸检测使用记录

Mediapipe&#xff0c;每秒200-300帧的实时人脸检测&#xff0c;提取画面中的人脸框&#xff0c;实现后续各种应用&#xff1a;人脸属性识别、表情识别、关键点检测、三维重建、增强现实、AI换妆等 code&#xff1a;google/mediapipe: Cross-platform, customizable ML soluti…

【NLP】从变形金刚到Transfomer 01

Transformer是一种非常强大的模型&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域里引起了一场革命。 "从变形金刚到技术革命家&#xff0c;Transformer不再仅是儿时屏幕上的英雄。&#x1f916;✨ 在今天的AI领域&#xff0c;它变身成为自然语言处理的超级英…

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件&#xff0c;不同的存储引擎提供了不同的功能和特性&#xff0c;可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎&#xff1a;InnoDB、MyISAM、MEMORY、NDB Cluster…