登录/注册

kmalloc

更多

kmalloc 是 Linux 内核中用于动态分配内存的一个核心函数。它的主要特点和用途如下:

  1. 内核空间分配: 它分配的内存位于内核的地址空间中。这意味着这段内存只能由运行在内核态的内核代码(如设备驱动程序、内核模块、文件系统代码等)访问,用户空间的应用程序无法直接访问这部分内存。
  2. 物理连续的内存: kmalloc 分配的内存在物理地址上是连续的。这对于需要与直接内存访问(DMA)硬件交互的场景至关重要,因为许多 DMA 控制器要求它们操作的缓冲区在物理内存中是连续的。
  3. 基于 Slab 分配器: kmalloc 通常在底层依赖于 Linux 内核的 slab 分配器(或它的变体,如 slub, slob) 来实现。Slab 分配器预先分配好一系列大小固定(通常是 2 的幂次方)的“块”或“对象”池,kmalloc 根据请求的大小从这些池中返回合适的块。这使得频繁分配和释放小块内存非常高效,减少了内存碎片。
  4. 大小限制: kmalloc 能够分配的内存块大小是有限的。这个上限取决于内核配置(主要是 KMALLOC_MAX_SIZE,通常在几 MB 到几十 MB 量级)。如果需要分配非常大的内存块,可能需要使用其他机制(如 vmalloc 或伙伴系统 alloc_pages)。
  5. 返回值: 分配成功时,返回一个指向新分配内存块的内核虚拟地址指针(类型是 void *)。分配失败时(例如内存不足),返回 NULL
  6. 标志 (gfp_t flags): kmalloc 需要传递一个重要的参数 gfp_t flags (GFP 代表 Get Free Pages)。这些标志控制分配行为,例如:
    • 内存从哪里来: 只能从普通内核内存区 (GFP_KERNEL) 分配?可以从高端内存区 (GFP_HIGHUSER) 分配?能否触发内存回收或 I/O (GFP_KERNEL)?是否绝对不能休眠 (GFP_ATOMIC)?
    • 分配行为: 是否需要清零内存 (GFP_ZERO 或 使用 kzalloc 函数)?是否需要 DMA 可用内存 (GFP_DMA, GFP_DMA32)?
    • 常用的标志:
      • GFP_KERNEL: 最常用。分配可能休眠(等待内存回收或 I/O),适用于可以休眠的进程上下文。
      • GFP_ATOMIC: 分配不允许休眠(例如在中断处理程序、软中断、持有自旋锁时使用)。分配可能失败的概率更高。
      • GFP_NOWAIT: 类似 GFP_ATOMIC,但失败时不会警告或触发 OOM。
      • GFP_USER: 为用户空间映射分配内存。
      • __GFP_ZERO: 分配后用零填充内存(kzalloc 就是 kmalloc(size, GFP_KERNEL | __GFP_ZERO) 的封装)。
  7. 释放内存: 使用 kmalloc 分配的内存必须使用 kfree 函数来释放。不释放会导致内核内存泄漏。

函数原型:

#include <linux/slab.h> // 包含 kmalloc/kfree 的声明

void *kmalloc(size_t size, gfp_t flags);

封装函数:

对比 vmalloc

总结:

kmalloc 是 Linux 内核开发者动态申请小块物理连续内存的首选方法。理解其物理连续性、大小限制以及 gfp_t flags 的使用(特别是 GFP_KERNELGFP_ATOMIC 的区别)对于编写正确高效的内核代码至关重要。分配的内存在不再使用时,必须使用 kfree 释放。

LSDK 21.08的Linux内核lkmod不安装是怎么回事?

(err -22) [11239.510536] cryptodev: disagrees about version of symbol kmalloc_caches [11239.510538

2023-05-12 07:35:53

LINUX内核中的内存是如何进行分配的

to allocate memory for申请内存的目标设备。sizeAllocation size申请的内存大小gfpAllocation gfp flags申请内存的类型标志2、kmalloc &

2022-11-04 14:46:37

《Linux内核深度解析》之内存地址空间

内核空间提供了把页划分成小内存块分配的块分配器,提供分配内存的接口 kmalloc()和释放内存的接口 kfree(),支持 3 种块分配器:SLAB 分配器、SLUB 分配器和 SLOB分配器。

2022-07-15 14:22:27

申请函数kmalloc、kzalloc、vmalloc区别说明

内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃。 那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些函数

2022-05-19 16:13:18

请问该如何释放slab的内存

{print sum/1024}'518.082slab占用了很大内存,且是SUnreclaim占用。用slabtop可以看到,里面有一个kmalloc-2048和kmalloc-256暂用了极大的内存

2022-01-05 07:33:06

内核的内存是如何进行分配的

嵌入式LINUX驱动学习之12内核内存分配一、头文件、函数及说明:一、头文件、函数及说明://头文件位置 : include/linux/slab.h/*申请内存函数:kmalloc()实现方式一般

2021-12-17 06:44:48

探究slab在内核内存管理和用户态Memcached的双重存在

,但是作为内核的堆用户本身,经常只是调用kmalloc()申请一个小内存,或者调用kmem_cache_alloc()申请一个数据结构,2^n页给它,会形成大量碎片浪费。所以slab找buddy要了2

2021-08-13 14:55:36

Linux用户空间与内核空间的区别?

为的分为两个部分--用户空间与内核空间。用户空间地址分布从0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB为内核空间。 区别如下:1、kmalloc

2020-06-05 04:35:30

Linux内核快速处理路径尽量多用kmem_cache而慎用kmalloc

仅仅为了测试是否会宕机,所以我的所有的数据结构的hash值均是一样的,这样插入200个项的话,它们会hash冲突,从而仅仅添加到同一个hlist链表中,这样整个匹配过程就退化成了遍历200个项的链表。

2020-04-30 15:35:18

Linux驱动技术之一:内存申请

kmalloc申请的内存在物理内存上是连续的,他们与真实的物理地址只有一个固定的偏移,因此存在简单的转换关系。

2019-05-08 14:35:50

7天热门专题 换一换
相关标签