linux kernel 学习手记2 Alloc memory -kmalloc

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

      第八章 分配内存

1.Kmalloc函数的内幕

Kmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零。

Flags参数

#include<linux/slab.h>

Void *kmalloc(size_t size, int flags);

第一个参数是要分配的块的大小,第二个参数是分配标志(flags),他提供了多种kmalloc的行为。

最常用的GFP_KERNEL,他表示内存分配(最终总是调用get_free_pages来实现实际的分配,这就是,这就是GFP前缀的由来)是代表运行在内核空间的进程执行的。使用GFP_KERNEL容许kmalloc在分配空闲内存时候如果内存不足容许把当前进程睡眠以等待。因此这时分配函数必须是可重入的。如果在进程上下文之外如:中断处理程序、tasklet以及内核定时器中这种情况下current进程不该睡眠,驱动程序该使用GFP_ATOMIC.

GFP_ATOMIC

用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.

GFP_KERNEL

内核内存的正常分配. 可能睡眠.

GFP_USER

用来为用户空间页来分配内存; 它可能睡眠.

GFP_HIGHUSER

如同 GFP_USER, 但是从高端内存分配, 如果有. 高端内存在下一个子节描述.

GFP_NOIO

GFP_NOFS

这个标志功能如同 GFP_KERNEL, 但是它们增加限制到内核能做的来满足请求. 一个 GFP_NOFS 分配不允许进行任何文件系统调用, GFP_NOIO 根本不允许任何 I/O 初始化. 它们主要地用在文件系统和虚拟内存代码, 那里允许一个分配睡眠, 但是递归的文件系统调用会是一个坏注意.

上面列出的这些分配标志可以是下列标志的相或来作为参数, 这些标志改变这些分配如何进行:

__GFP_DMA

这个标志要求分配在能够 DMA 的内存区. 确切的含义是平台依赖的并且在下面章节来解释.

__GFP_HIGHMEM

这个标志指示分配的内存可以位于高端内存.

__GFP_COLD

正常地, 内存分配器尽力返回"缓冲热"的页 -- 可能在处理器缓冲中找到的页. 相反, 这个标志请求一个"", 它在一段时间没被使用. 它对分配页作 DMA 读是有用的, 此时在处理器缓冲中出现是无用的. 一个完整的对如何分配 DMA 缓存的讨论看"直接内存存取"一节在第 1 .

__GFP_NOWARN

这个很少用到的标志阻止内核来发出警告(使用 printk ), 当一个分配无法满足.

__GFP_HIGH

这个标志标识了一个高优先级请求, 它被允许来消耗甚至被内核保留给紧急状况的最后的内存页.

__GFP_REPEAT

__GFP_NOFAIL

__GFP_NORETRY

这些标志修改分配器如何动作, 当它有困难满足一个分配. __GFP_REPEAT 意思是" 更尽力些尝试" 通过重复尝试 -- 但是分配可能仍然失败. __GFP_NOFAIL 标志告诉分配器不要失败; 它尽最大努力来满足要求. 使用 __GFP_NOFAIL 是强烈不推荐的; 可能从不会有有效的理由在一个设备驱动中使用它. 最后, __GFP_NORETRY 告知分配器立即放弃如果得不到请求的内存.

 

2.内存区段

__GFP_DMA__GFP_HIGHMEM的使用与平台相关,Linux把内存分成3个区段:可用于DMA的内存、常规内存、以及高端内存。X86平台上ISA设备DMA区段是内存的前16MB,而PCI设备无此限制。

内存区后面的机制在 mm/page_alloc.c 中实现, 而内存区的初始化在平台特定的文件中, 常常在 arch 目录树的 mm/init.c

Linux 处理内存分配通过创建一套固定大小的内存对象池. 分配请求被这样来处理, 进入一个持有足够大的对象的池子并且将整个内存块递交给请求者. 驱动开发者应当记住的一件事情是, 内核只能分配某些预定义的, 固定大小的字节数组.

如果你请求一个任意数量内存, 你可能得到稍微多于你请求的, 至多是 2 倍数量. 同样, 程序员应当记住 kmalloc 能够处理的最小分配是 32 或者 64 字节, 依赖系统的体系所使用的页大小. kmalloc 能够分配的内存块的大小有一个上限. 这个限制随着体系和内核配置选项而变化. 如果你的代码是要完全可移植, 它不能指望可以分配任何大于 128 KB. 如果你需要多于几个 KB, 但是, 有个比 kmalloc 更好的方法来获得内存

 

 
Linux 7.2内核slab分配器优化:延迟构建freelist提升70%内存分配性能 Linux 7.2 内核在内存管理领域进行了一次值得关注的底层重构,这次“动刀”的目标是 slab 分配器的 freelist 构建机制。对于长期受困于内存碎片化、slab 内存泄露或系统性能抖动的开发者和运维人员来说,这无疑是一个重磅消息。简单来说,这项优化通过将 freelist 的构建从“即时”改为“延迟”,显著减少了内存分配路径上的开销,官方数据显示,特定场景下每次内存分配的速度最高可提升 70%。这不仅仅是性能数字的提升,更是对 Linux 内核核心基础设施的一次深度打磨。 本文我们将深入解析这项 阅读详情

相关推荐

Linux DMA一致性内存管理原理与实践

DMA(直接内存访问)是提升外设与内存间数据传输效率的核心机制,而一致性DMA内存解决了CPU与设备访问内存时的缓存一致性问题。通过硬件架构(如ARM的CCI总线)和Linux内核API(如dma_alloc_coherent)的协同工作,开发者可以确保数据传输的正确性。在驱动开发中,合理选择内存分配参数和调试技巧(如使用CMA分配器)对性能优化至关重要。本文以ARM平台为例,深入解析DMA一致性原理及其在网络驱动、AI加速卡等场景中的实践应用,帮助开发者规避常见的数据损坏和性能瓶颈问题。

weixin_33858485的博客 403

tasklet上下文内存分配触发might_alloc检查及同步回收调用链

tasklet上下文内存分配触发might_alloc检查及同步回收调用链,tasklet,might_alloc,内存分配,直接内存回收,slab,slob,slub,kmalloc到直接内存回收的完整调用链

zhaoxin1989的博客 1万+

allocate memory 分配内存

本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 392

SYS-BIOS中mallocMemory_alloc的区别

注:该文转自网上,版权归原作者所有,不知道是从哪里下载的了,这里就不贴网址了;   SYS-BIOS中mallocMemory_alloc的区别 2013.3 TI CI FAE   SYS-BIOS中mallocMemory_alloc的区别.. 1 2013.3. 1 TI CI FAE. 1 1       关于mallocMemory_alloc的区别..

smilestone322的专栏 6692

昆仑通态MCGS 模拟运行提示 uncomress alloc memory no memory 错误

1、软件提示如下内容:点击确定后提示关闭程序对话框。2、台式电脑信息:3、昆仑通态软件版本信息4、解决方法:在MCGS组态环境上 右键选择属性,切换到“兼容性”选项卡,在兼容模式勾选,并选择windows 7,重新打开即可。...

牙擦苏-kuan 1万+

Cannot allocate memory 的分析及解决方法

背景 拿到一台基于VMware的虚拟机,安装一个公司产品,包含各个组件(微服务springboot),内存要求较高。 问题 安装产品过程中,出现如下问题: 问题分析 问题定位:无非就是软件安装时的问题或者服务器问题。但考虑到之前该产品已经在多台服务器、现场都进行了正常安装,优先排查问题的思路方向指向服务器上。 那目前情况必须要先连上服务器...

baidu_20608025的博客 9万+

[Linux]How to alloc memory (kmalloc) in Linux ISR

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34362875的博客 161

Linux kernel Memory Allocation Functions: devm_kmalloc / devm_kzalloc / devm_kfree

Linux kernel Memory Allocation Functions: devm_kmalloc / devm_kzalloc / devm_kfree Kernel version: 5.10 1.void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp); drivers/base.devres.c 813 /** 814 * devm_kmalloc - Resource-managed kmalloc 815

Stephen1120的博客 715

Kernel Memory Allocation

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34192993的博客 211

Kernel driver内存泄露问题排查指南

如果出现SUnreclaim一直持续增加,那么应该查看slabinfo,看下是否是哪个slab成员在持续增加,如果有,则怀疑是该slab出现了内存泄露的情况,那可以打开CONFIG_SLUB_DEBUG_ON和CONFIG_SLUB_DEBUG,并且检查CONFIG_DEBUG_FS是开的,然后修改dts中的内核启动bootargs,在bootargs中增加"slub_debug=u,kmalloc-xxx(需要denug的slab)"

DAAXDS的博客 255

kernel memory code learn

mem alloc page Noticeble: 1. there are two kind of page: virtual page, physical page. 2. the page struct is abstract of physical memory page, but not virtual memory! struct page { unsigned long...

weixin_34018169的博客 227

slab/slub/slob: Linux kernel memory mngmt

In linux mm folder, there are 3 files that about kmalloc/kmem, slab/slub/slob, where slab.c defines general memory usage, slub.c defines modern memory usage, and slob.c defines embedded device memory ...

weixin_33816611的博客 258

内存学习资料

linux内存管理(一): arm64内核内存布局_Hober-CSDN博客_arm64 内存管理 Linux内存管理(二):ARMv8 地址转换_Hober-CSDN博客 Linux内存管理(三):“看见”物理内存_Hober-CSDN博客_init_pg_dir Linux内存管理(四):paging_init分析_Hober-CSDN博客_init_pg_dir Linux内存管理(五):描述物理内存_Hober-CSDN博客 Linux内存管理(六): 分配物理内存alloc_pages.

suifengershi2000的博客 446

linux kernel development (12 Memory Management)

  Yo u c a n n o t s p e c i f y __GFP_HIGHMEM  to either __get_free_pages()  or kmalloc(). Because these both return a logical address, and not a page  structure, it is possible that these fu...

weixin_34162695的博客 88

linux中的内存分配接口简析(五)

1.概览   那内存分配对于驱动工程师来说就是指的DRAM,不包括iROM/SRAM/CPU cache等SOC内部的内存。下面提到的内存管理,其所管理的主体就是DRAM。在linux中对内存的描述单位是页page,它对应的数据结构为struct page,定义如下 //include\linux\mm_types.h struct page { struct { /* Page cache and anonymous pages */ /* See page-flags.h fo

flagstaff's blogs 1138

如何量化你的Linux内核内存开销?

本文详细解析了Linux内核内存开销的构成与量化方法,包括静态内存和动态内存的分类与测量。通过dmesg、/proc文件系统和专业工具如slabtop,帮助开发者精确监控内核内存使用,优化系统性能。特别关注slab分配器和vmalloc区域的内存管理策略,为Linux系统调优提供实用指导。

weixin_33923762的博客 332

揭开 Linux 虚拟内存的神秘面纱

在最早的计算机时代,程序员写代码是直接对着物理内存地址操作的。假如你想读取内存里的某个变量,你就直接写死一个物理地址,比如0x0000FFFF。这就像是住在一个只有几间房的小公寓里,你可以随便踹开隔壁的门。但这就导致了严重的**“串门”问题**。如果程序 A 不小心改写了程序 B 的数据,整个系统就会崩溃。更麻烦的是,随着程序越来越大,物理内存根本装不下这么多程序。于是,现代操作系统发明了虚拟内存(Virtual Memory)。

weixin_42108533的博客 76

Linux kernel学习-内存管理

转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/linux-kernel-learning-memory-management/ 接着之前的 Linux kerne...

weixin_34262482的博客 242
上一篇: linux kernel 学习手记1 Time, Delays, and Deferred Work
下一篇: linux kernel 学习手记3 I/O
human3000
博客等级 码龄26年 22粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值