kmalloc
kmalloc 是 Linux 内核中用于动态分配内存的一个核心函数。它的主要特点和用途如下:
- 内核空间分配: 它分配的内存位于内核的地址空间中。这意味着这段内存只能由运行在内核态的内核代码(如设备驱动程序、内核模块、文件系统代码等)访问,用户空间的应用程序无法直接访问这部分内存。
- 物理连续的内存:
kmalloc分配的内存在物理地址上是连续的。这对于需要与直接内存访问(DMA)硬件交互的场景至关重要,因为许多 DMA 控制器要求它们操作的缓冲区在物理内存中是连续的。 - 基于 Slab 分配器:
kmalloc通常在底层依赖于 Linux 内核的 slab 分配器(或它的变体,如 slub, slob) 来实现。Slab 分配器预先分配好一系列大小固定(通常是 2 的幂次方)的“块”或“对象”池,kmalloc根据请求的大小从这些池中返回合适的块。这使得频繁分配和释放小块内存非常高效,减少了内存碎片。 - 大小限制:
kmalloc能够分配的内存块大小是有限的。这个上限取决于内核配置(主要是KMALLOC_MAX_SIZE,通常在几 MB 到几十 MB 量级)。如果需要分配非常大的内存块,可能需要使用其他机制(如vmalloc或伙伴系统alloc_pages)。 - 返回值: 分配成功时,返回一个指向新分配内存块的内核虚拟地址指针(类型是
void *)。分配失败时(例如内存不足),返回NULL。 - 标志 (
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)的封装)。
- 内存从哪里来: 只能从普通内核内存区 (
- 释放内存: 使用
kmalloc分配的内存必须使用kfree函数来释放。不释放会导致内核内存泄漏。
函数原型:
#include <linux/slab.h> // 包含 kmalloc/kfree 的声明
void *kmalloc(size_t size, gfp_t flags);
size: 请求分配的内存字节数。flags: 分配标志(GFP_系列标志),控制分配行为和来源。
封装函数:
kzalloc(size, flags): 相当于kmalloc(size, flags | __GFP_ZERO),分配并清零内存。非常常用。
对比 vmalloc:
kmalloc分配物理连续内存,虚拟地址也连续。速度快(尤其在 slab 缓存命中时),适合小块内存和需要 DMA 的内存。vmalloc分配虚拟地址连续但物理地址不一定连续的大块内存。速度相对较慢(需要建立页表映射),主要用于分配非常大的缓冲区(超过kmalloc限制),物理连续性不重要时。
总结:
kmalloc 是 Linux 内核开发者动态申请小块物理连续内存的首选方法。理解其物理连续性、大小限制以及 gfp_t flags 的使用(特别是 GFP_KERNEL 和 GFP_ATOMIC 的区别)对于编写正确高效的内核代码至关重要。分配的内存在不再使用时,必须使用 kfree 释放。
LSDK 21.08的Linux内核lkmod不安装是怎么回事?
(err -22) [11239.510536] cryptodev: disagrees about version of symbol kmalloc_caches [11239.510538
LINUX内核中的内存是如何进行分配的
to allocate memory for申请内存的目标设备。sizeAllocation size申请的内存大小gfpAllocation gfp flags申请内存的类型标志2、kmalloc &
《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暂用了极大的内存
内核的内存是如何进行分配的
嵌入式LINUX驱动学习之12内核内存分配一、头文件、函数及说明:一、头文件、函数及说明://头文件位置 : include/linux/slab.h/*申请内存函数:kmalloc()实现方式一般
探究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
Linux内核快速处理路径尽量多用kmem_cache而慎用kmalloc
仅仅为了测试是否会宕机,所以我的所有的数据结构的hash值均是一样的,这样插入200个项的话,它们会hash冲突,从而仅仅添加到同一个hlist链表中,这样整个匹配过程就退化成了遍历200个项的链表。
2020-04-30 15:35:18
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览