JJJ:kmem_cache_create、kmem_cache_destroy、kmem_cache_alloc、kmem_cache_free用法

kmem_cache的创建和释放-slub分配器 目录 kmem_cache_create kmem_cache_create_usercopy __kmem_cache_alias find_mergeable create_cache __kmem_cache_create kmem_cache_open kmem_cache_destroy shutdown_cache 内核版本:kernel-4.19 ​​​​​​​kmem_cache是slub... 阅读详情

kmem_cache_create

struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align,
                          unsigned long flags, void (*ctor)(void*),
                          void (*dtor)(void*));
参数解释:
const char *name: 缓存的名字,这个字符串会在/proc/slabinfo等内核调试信息中显示。
size_t size: 对象的大小,即缓存中每个对象所占的字节数。
size_t align: 对齐要求,指明对象在内存中的对齐粒度,通常是为了满足特定硬件或协议的要求。
unsigned long flags: 一组标志位,用来控制slab的行为,如SLAB_HWCACHE_ALIGN、SLAB_PANIC、SLAB_RECLAIM_ACCOUNT等。
void (*ctor)(void*): 可选的构造函数,如果提供,当从缓存分配一个新的对象时,会调用该函数初始化新对象的内容。

详细说明:
一种内核内存管理机制,特别针对小对象的高效分配和释放设计。
kmem_cache_create 函数创建的并不是一个具体的内存缓存对象,而是创建了一个用于管理固定大小内存块的slab缓存控制器。这个控制器(即kmem_cache结构体)是用来组织和分配多个相同大小的对象。

当调用 kmem_cache_create 时,您需要指定 size_t size 参数,这个参数指定了将来从该缓存分配出的每个对象的实际大小。因此,你不能直接说 kmem_cache_create 创建的内存缓存对象大小是多少,而应该说通过调用此函数并传入特定大小值后,可以用来分配相应大小的对象。例如,如果传给 size 的参数是512字节,则此slab缓存将用于分配大小为512字节的对象。

调用 kmem_cache_create 创建的slab缓存控制器,可以通过cat /proc/slab 来查看

kmem_cache_destroy

kmem_cache_create 对应的释放函数

代码示例:

#include <linux/slab.h>

static void my_ctor(void *ptr) {
    // 初始化对象
}

static void my_dtor(void *ptr) {
    // 清理对象
}

struct kmem_cache *my_cache;

static int __init my_init(void)
{
    my_cache = kmem_cache_create("my_cache", sizeof(struct my_struct), 
                                 __alignof__(struct my_struct),
                                 SLAB_HWCACHE_ALIGN | SLAB_PANIC,
                                 my_ctor, my_dtor);
    if (!my_cache) {
        return -ENOMEM;
    }
    // 其他初始化操作...
    return 0;
}
module_init(my_init);

static void __exit my_exit(void)
{
    kmem_cache_destroy(my_cache);  // 在模块退出时销毁缓存
}
module_exit(my_exit);

通过调用 kmem_cache_create() 创建缓存后,就可以使用 kmem_cache_alloc() 和 kmem_cache_free() 来快速地分配和释放这些类型的内存块。这有助于减少因频繁分配和释放小对象而带来的系统开销。

kmem_cache_alloc 和 kmem_cache_free

void *kmem_cache_alloc(struct kmem_cache * cachep, gfp_t flags);

参数解释:

struct kmem_cache * cachep: 由 kmem_cache_create() 创建的slab缓存指针。
gfp_t flags: 分配时使用的标志,用于控制如何进行内存分配以及在何种情况下可以阻塞等待内存可用。常见的标志包括但不限于:
GFP_KERNEL:用于正常运行时分配,可能会睡眠(不能在中断上下文或原子上下文中使用)。
GFP_ATOMIC:用于不能睡眠的情况,如中断处理程序、软中断或者tasklet中。
GFP_NOIO:禁止分配过程中执行任何I/O操作。
GFP_NOWAIT:同GFP_ATOMIC类似,不过不是所有的内存区域都支持此标志。
GFP_HIGHUSER、GFP_USER等:用于用户空间映射的内存分配。

例程:

#include <linux/slab.h>

struct my_struct;
static struct kmem_cache *my_cache;

// 假设my_cache已经通过kmem_cache_create创建好

struct my_struct *alloc_my_struct(void) {
    struct my_struct *obj = NULL;

    obj = kmem_cache_alloc(my_cache, GFP_KERNEL); // 或者根据需要选择合适的gfp_t标志
    if (!obj) {
        printk(KERN_ERR "Failed to allocate memory from cache\n");
        return NULL;
    }

    // 对新分配的对象进行初始化...
    return obj;
}

void free_my_struct(struct my_struct *obj) {
    kmem_cache_free(my_cache, obj);
}

代码示例

// drivers/dma/ioat/init.c
...
1391 static int __init ioat_init_module(void)
1392 {
1393     int err = -ENOMEM;
1394
1395     pr_info("%s: Intel(R) QuickData Technology Driver %s\n",
1396         DRV_NAME, IOAT_DMA_VERSION);
1397
1398     ioat_cache = kmem_cache_create("ioat", sizeof(struct ioat_ring_ent),
1399                     0, SLAB_HWCACHE_ALIGN, NULL);
1400     if (!ioat_cache)
1401         return -ENOMEM;
1402
1403     ioat_sed_cache = KMEM_CACHE(ioat_sed_ent, 0);
1404     if (!ioat_sed_cache)
1405         goto err_ioat_cache;
1406
1407     err = pci_register_driver(&ioat_pci_driver);
1408     if (err)
1409         goto err_ioat3_cache;
1410
1411     return 0;
1412
1413  err_ioat3_cache:
1414     kmem_cache_destroy(ioat_sed_cache);
1415
1416  err_ioat_cache:
1417     kmem_cache_destroy(ioat_cache);
1418
1419     return err;
1420 }
1421 module_init(ioat_init_module);
1422
1423 static void __exit ioat_exit_module(void)
1424 {
1425     pci_unregister_driver(&ioat_pci_driver);
1426     kmem_cache_destroy(ioat_cache);
1427 }
1428 module_exit(ioat_exit_module);
134 /*
135  * Please use this macro to create slab caches. Simply specify the
136  * name of the structure and maybe some flags that are listed above.
137  *
138  * The alignment of the struct determines object alignment. If you
139  * f.e. add ____cacheline_aligned_in_smp to the struct declaration
140  * then the objects will be properly aligned in SMP configurations.
141  */
142 #define KMEM_CACHE(__struct, __flags) kmem_cache_create(#__struct,\
143         sizeof(struct __struct), __alignof__(struct __struct),\
144         (__flags), NULL)
//drivers/dma/ioat/prep.c
 91 static struct ioat_sed_ent *
 92 ioat3_alloc_sed(struct ioatdma_device *ioat_dma, unsigned int hw_pool)
 93 {
 94     struct ioat_sed_ent *sed;
 95     gfp_t flags = __GFP_ZERO | GFP_ATOMIC;
 96
 97     sed = kmem_cache_alloc(ioat_sed_cache, flags);
 98     if (!sed)
 99         return NULL;
100
101     sed->hw_pool = hw_pool;
102     sed->hw = dma_pool_alloc(ioat_dma->sed_hw_pool[hw_pool],
103                  flags, &sed->dma);
104     if (!sed->hw) {
105         kmem_cache_free(ioat_sed_cache, sed);
106         return NULL;
107     }
108
109     return sed;
110 }

Linux内存管理(34):slub 分配器之kmem_cache_alloc 如《slub 分配器初始化》一文第3.1节 bootstrap()函数中调用 kmem_cache_zalloc() 从kmem_cache中获取object。又如《slub 分配器初始化》一文第 5 节create_kmalloc_caches() 函数中通过 kmem_cache_zalloc() 创建kmalloc cache 的object。又如一文中第6节通过 kmem_cache_alloc_node() 创建 kmem_cache_node 的object,最终调用到的都是。 阅读详情

相关推荐

Linux内存管理(33):slub 分配器之__kmem_cache_create

是数据结构 kmem_cache 创建的核心函数,无论是在slab 初始化期间,还是在用户层调用 kmem_cache_create() 创建slab 描述符时,都离不开这个核心函数。为了减少slab 初始化和 kmem_cache_create() 博文的繁琐,我们将该函数单独提出来剖析。本文重点分析slub 分配器中 __kmem_cache_create() 的实现过程。

私房菜 1644

Linux内核源码剖析之kmem_cache_create

一个操作系统对于内存的管理是非常的重要,关乎到整个系统的运行效率和内存最大使用率。内存管理从宏观来看,无非就是使内存达到最大使用率,减少内存的内/外碎片。而在Linux内核中使用伙伴算法(Buddy)管理一组页,使用Slab算法管理单独页,伙伴算法+Slab算法合理的避免内存的内/外碎片。那么今天介绍的kmem_cache_create方法就是Slab算法。

李哈zzz的博客 2376

Linux内存管理(35):slub 分配器之kmem_cache_create

slub 分配器初始化》一文中我们详细分析了slub 分配的初始化流程,最开始slub 系统没创建好,系统利用了局部变量和,临时创建了两个slab,创建完成后使用将全局变量和管理结构迁入,摆脱静态局部变量管理,至此slub 系统初步形成。紧接着通过创建kmalloc 需要的 slab caches(大概14组),此时通过更新为UP,标记slub 系统正式创建完成。

私房菜 1127

内存分配接口汇总

对于160M的系统而言,vmalloc_start位置应在3G+160M附近(在物理内存映射区与vmalloc_start期间还存在一个8M的gap来防止跃界),vmalloc_end的位置接近4G(最后位置系统会保留一片128k大小的区域用于专用页面映射),kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址。...

生活需要深度 1440

Prokka实战:10分钟搞定细菌基因组注释(附详细参数解析)

本文深入解析Prokka细菌基因组注释工具的核心参数与实战策略。通过拆解其集成化工作流程,详细解读物种分类、功能注释、输出控制等关键参数,并提供快速初筛、高质量发表、质粒注释及批量处理四种典型场景的高效参数组合方案,帮助用户精准掌控注释过程,将原始序列转化为有价值的生物学见解。

weixin_29271053的博客 442

AMEsim不连续处理机制:仿真精度与效率的平衡艺术

本文深入解析AMEsim不连续处理机制在系统仿真中的应用,探讨如何平衡仿真精度与效率。通过液压系统仿真案例,详细介绍了事件检测算法、变步长求解器自适应策略及典型场景优化方法,帮助工程师有效应对仿真中的不连续性问题,提升仿真效率和准确性。

v4w5x6的博客 439

Linux中的内存分配和释放之kmem_cache_alloc()函数分析

  记得上篇文章中我们提到了这个函数,在kmem_cache_create()函数调用它的语句是cachep = (kmem_cache_t *) kmem_cache_alloc(&cache_cache, SLAB_KERNEL);这里的cachep是我们要申请的高速缓存内存的描述结构体(kmem_cache_t),但是我们也需要高速缓存内存来存放这个结构体。就是cache_cache所描

satanwxd的专栏 2万+

Mimics 21.0软件学习笔记(一)基本操作

Materialise Mimics 21.0打开工程窗口化Thresholding 二值化Region growing区域增长创建一个3D表示,并显示股骨头从髋臼中区分出来,并单独为股骨头建立3D模型 打开工程 Opening the Project 窗口化 Windowing 二值化 Thresholding 区域增长 Region Growing 建立 3D 表示 Creating a 3D representation 显示 3D 表示 Displaying a 3D representation

qq_35495464的博客 4万+

kmem_cache_alloc函数使用

<br />为了更好的得到问题解决,也对问题的提出进点义务,在抛出我的问题前先简单介绍一下Linux下slab高速缓存的使用方法。<br /><br />在内核编程中,可能经常会有一些数据结构需要反复使用和释放,按照通常的思路,可能是使用kmalloc和kfree来实现。<br />但是这种方式效率不高,Linux为我们提供了更加高效的方法——Slab高速缓存管理器<br />通过先使用kmem_cache_create函数创建一个高速缓存的头指针——在内核中是struct kmem_cache结构,具体用

3177

避坑指南:Unity与Visual Studio开发环境配置中的5个常见问题及解决方案

本文针对Unity与Visual Studio开发环境配置中的5个常见问题,提供了详细的解决方案。重点解决了项目文件生成失败导致命名空间无法识别、调试器无法附加、包管理器与扩展安装混乱、脚本编译错误以及多版本环境冲突等核心痛点,帮助开发者构建稳定高效的开发调试环境。

weixin_27791839的博客 279

某教育平台线上用户流失分析

本项目基于某教育平台的用户登录信息、用户个人信息以及用户课程学习记录三信息表,挖掘了平台流量以及用户流失等信息。使用python对数据进行预处理,使用tableau进行数据可视化分析。该教育平台正值窗口期,平台流量没有良好的留存水平,但有良好的发展趋势,需要深入分析用户留存率低,做好招新促活营销。该教育平台的基本盘在广东、湖北、河南、贵州等省份,线上教育的潜在用户可能更多分布在线下教育资源不充足、受疫情影响更为严重的地区。

fhy12的博客 1299

内存管理API之kmem_cache_alloc

void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)用于从缓存中申请内存。 其使用的例程如下: table->table = kmem_cache_alloc(amd_iommu_irq_cache, GFP_ATOMIC); if (!table->table) { kfree(table); table = N

jason的笔记 6929

STM32 I²C外设深度解析:时序配置、主从模式与可靠性工程

I²C是一种广泛应用于嵌入式系统的同步串行总线协议,其核心在于精确的时序控制与可靠的电气特性匹配。理解SCL/SDA信号建立/保持时间、上升下降沿约束及硬件滤波机制,是保障通信稳定的基础;STM32通过I2C_TIMINGR寄存器实现对PRESC、SCLH、SCLL、SDADEL和SCLDEL等关键参数的精细调控,直接影响tSU:DAT、tVD:DAT等标准时序合规性;该能力支撑工业级高可靠场景下的主从双向通信、时钟拉伸管理与错误恢复;本文聚焦STM32平台,结合寄存器级配置、状态机行为与实战调试经验,系统

weixin_42146230的博客 87

kmem_cache_alloc

***/void *slab_allocreturn ret;slab_allocvoid *objp;cachep))objp =return。

wmzjzwlzs的专栏 563

YOLO项目部署:从Python脚本到Docker容器的企业级交付全流程

YOLO模型企业级Docker部署方案 核心挑战 环境一致性:解决"本地能跑,服务器崩掉"问题 可扩展性:支持单实例到多实例扩展 稳定性:确保99.9%可用性 部署流程 项目改造:模块化代码,分离配置 Docker镜像:支持CPU/GPU环境 API服务:封装推理逻辑 监控告警:实现自动化运维 技术方案 需求 解决方案 环境一致性 Docker镜像+依赖冻结 可扩展性 K8s+负载均衡 稳定性 健康检查+自动重启 项目结构 模块化代码组织 外部化配置管理 精确依赖版本控制 摘要重点:通过

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1229

统计滤波器

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对统计滤波器做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1643

kmem_cache_alloc核心函数slab_alloc_node的实现详解

kmem_cache_alloc()是申请slub对象的入口函数,他的核心实现就是slab_alloc_node函数,此函数涉及的面很广,包括cgroup,进程调度,内存管理,cpu抢占等细节,需要仔细推敲深究; 代码版本:kernel-3.10 (一)全函数概要 /* * Inlined fastpath so that allocation functions (kma...

hzj_001的博客 4416

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SLUB内存管理的4个主要接口函数介绍(3)

本篇主要介绍slab object释放的函数kmem_cache_free

weixin_45337360的博客 3644

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

内存管理API之kmem_cache_free

void kmem_cache_free(struct kmem_cache *cachep, void *objp)用于释放kmem_cache_alloc 申请的内存。 其源码分析如下: void kmem_cache_free(struct kmem_cache *cachep, void *objp) { unsigned long flags; #这个函数主要是检查这个slab 是否

jason的笔记 2706

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《趣谈Linux》总结四:内存管理

16 内存管理(上)-规划进程内存空间布局 每个进程应该有自己的内存空间。 内存空间都是独立的、相互隔离的。 对于每个进程来讲,看起来应该都是独占的。 16.1 独享内存空间的原理 内存都被分成一块一块儿的,都编好了号,这些一块一块的地址是实实在在的地址,通过这个地址我们就能够定位到物理内存的位置; 如果所有进程都使用这些地址,同时发生同一个位置的写操作时很容易起冲突 所以使用虚拟地址:物理地址对于进程不可见,谁也不能直接访问这个物理地址。 操作系统会给进程分配一个虚拟地址。 所有进程看到的这个地址

chuixue24的博客 1081

Linux内核模块开发之创建slab内存缓存(kmem_cache_*)

本文将深入探讨Linux内核中的内存管理机制和slab内存缓存的概念。我们将解释内存管理机制在操作系统中的作用,介绍slab内存缓存的结构和特点,并讨论创建专用的内存缓存编程接口的方法。通过详细的实现步骤和示例代码,读者将能够深入了解内存缓存的数据结构和实际应用。本文将为初学者和有经验的开发人员提供有关内存管理和slab内存缓存的全面指南,帮助他们优化系统性能并构建高效的应用程序。

Lion_Long的博客 1694

slub分配流程-kmem_cache_alloc函数

slub分配流程-kmem_cache_alloc函数 static __always_inline void *slab_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node, unsigned long addr) { void *object; struct kmem_cache_cpu *c; struct page *page; unsign

biaotai的博客 1159

Linux内存管理十三 Linux slab分配器

在Linux中,伙伴系统是以页为单位分配内存。但是现实中很多时候却以字节为单位,不然申请10Bytes内存还要给1页的话就太浪费了。slab分配器就是为小内存分配而生的。slab分配器分配内存以Byte为单位。但是slab分配器并没有脱离伙伴系统,而是基于伙伴系统分配的大内存进一步细分成小内存分配。 走进slub ...

caofengtao1314的专栏 818

内存管理-SLAB(创建SLAB高速缓存kmem_cache_create())

这篇主要讲解专用高速缓存的创建函数kmem_cache_create()的流程。kmem_cache_create()主要是建立的cache描述符,填充了其成员,设置cpu local slab,设置外置slab描述符还是内置slab描述符,并没有分配slab块和对象。最终将cache描述符添加到cache_chain链表上。 首先写了一个简单的测试程序: [cpp]

白水煮鸡蛋 2万+

内存管理API之kmem_cache_create

struct kmem_cache * kmem_cache_create(const char *name, size_t size, size_t align, slab_flags_t flags, void (*ctor)(void *)) 用于创建一个新的slab 缓存,一般在驱动初始化的时候用。 其使用的例程如下: amd_iommu_irq_cache = kmem_ca

jason的笔记 1835

SLUB内存管理的4个主要接口函数介绍(2)

slub内存管理的4个主要接口函数如下(参考kernel-4.19代码): //slab缓存的创建 struct kmem_cache *kmem_cache_create(const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void *)); //slab object的分配 void *kmem_cache_alloc(struct kmem_cache *cachep, int......

weixin_45337360的博客 1928
上一篇: 案例需求:多人聊天室
下一篇: /proc目录下助于调试相关的文件
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值