首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

图解slub

1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...说明:slub是slab中的一种,slab也是slab中的一种。有时候用slab来统称slab, slub和slob。slab, slub和slob仅仅是分配内存策略不同。...本篇文章中说的是slub分配器工作的原理。但是针对分配器管理的内存,下文统称为slab缓存池。所以文章中slub和slab会混用,表示同一个意思。...2. slub数据结构 slub的数据结构相对于slab来说要简单很多。并且对外接口和slab兼容。所以说,从slab的系统更换到slub,可以说是易如反掌。...主要是一些部分使用object的slab 2.4. slub接口 了解了基本的数据结构,再来看看slub提供的API。如果你了解slub,我想这几个接口你是再熟悉不过了。

1.1K30

Slub分配器的来龙去脉

slab分配器设计的需求 在Linux内核的内存子系统中,伙伴系统无疑处于内存管理的核心地带,但是如果将内存管理从逻辑上分层,它的位置则处于最底层。...在Linux中也实现了具有相同的基本设计思想的同名分配器slab。...在slab引入Linux的很多年内,其都是Linux内核管理对象缓冲区的主流算法。并且由于slab的实现非常复杂,很长一段时间内都少有对它的改动。...《linux内核内存管理slub算法(一)原理》 Slub的工作原理和日常生产生活的产销环节很类似,所以为了清晰直观的看到其工作原理,我把这个过程画了一幅图来表示,如下图: 每个零售商(kmem_cache...《linux内核内存管理slub算法(一)原理》 总的来说,Slub就相当于零售商,它从伙伴系统“批发”内存,然后再零售出去。

77930
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核内存管理与漏洞利用

前言 网上已经有很多关于Linux内核内存管理的分析和介绍了,但是不影响我再写一篇:一方面是作为其他文章的补充,另一方面则是自己学习的记录、总结和沉淀。...使用Buddy算法的的应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术的一个现代内存分配器。 Linux内核中的伙伴系统块大小为一页,通常是4096字节。...因此Linux引入了Slab分配器,加速对object的分配和释放速度,同时也减少碎片空间。 最初接触的时候心里通常有个大大的问号:Slab是什么?...【文章福利】【Linux内核内存管理专题训练营】火热开营!!...最新Linux内核技术详解 独家Linux内核内存管理干货分享 入营地址:inux内核内存管理专题训练营 两天持续技术输出: -------------------- 第一天: 1.物理内存映射及空间划分

2.3K00

深入理解 slab cache 内存分配全链路实现

// 定义在文件 /include/linux/slub_def.h 中 #ifdef CONFIG_SLUB_CPU_PARTIAL // 获取 slab cache 本地 cpu 缓存的 partial...也用尽了,无法找到可以分配对象的 slub 了 // 只能向底层伙伴系统重新申请内存页(slub),然后从新的 slub 中分配对象 page = new_slab(s, flags,...alloc_pages_node(node, flags, order); return page; } 关于 alloc_pages 函数分配物理内存页的详细过程,感兴趣的读者可以回看下 《深入理解 Linux...KASAN_KMALLOC_REDZONE); } 关于 slab 对象内存布局的核心逻辑封装在 setup_object_debug 函数中: // 定义在文件:/include/linux...image.png // 定义在文件:/include/linux/poison.h #define SLUB_RED_INACTIVE 0xbb // 定义在文件:/include/linux/

23520

K8S 问题排查:cgroup 内存泄露问题

这篇文章的全称应该叫:[在某些内核版本上,cgroup 的 kmem account 特性有内存泄露问题],如果你遇到过 pod 的 cannot allocated memory 报错,node 内核日志的 SLUB...2、节点上执行 dmesg 有日志显示:slub无法分配内存:SLUB: Unable to allocate memory on node -1 ?...内核内存与用户内存: 内核内存:专用于Linux内核系统服务使用,是不可swap的,因而这部分内存非常宝贵的。...为了防止这种攻击,社区中提议通过linux内核限制 cgroup中的kmem 容量,从而限制恶意进程的行为,即kernel memory accounting机制。...slub 分配机制 因为节点 dmesg 的报错是:SLUB: Unable to allocate memory on node -1 cgroup 限制下,当用户空间使用 malloc 等系统调用申请内存时

8K41

宋牧春: Linux内核内存corruption检查机制KASAN实现原理

功能比SLUB DEBUG齐全并且支持实时检测。越界访问的严重性和危害性通过我之前的文章(SLUB DEBUG技术)应该有所了解。正是由于SLUB DEBUG缺陷,因此我们需要一种更加强大的检测工具。...目前KASAN仅支持x86_64和arm64架构(linux 4.4版本合入)。你使用ARM64架构,那么就需要保证linux版本在4.4以上。...当然了,如果你使用的linux也有可能打过KASAN的补丁。例如,使用高通平台做手机的厂商使用linux 3.18同样支持KASAN。 3....CONFIG_SLUB_DEBUG=y CONFIG_KASAN=y 为什么这里必须打开SLUB_DEBUG呢?是因为有段时间KASAN是依赖SLUBU_DEBUG的,什么意思呢?...在打开SLUB_DEBUG的时候,object就增加很多内存,KASAN打开之后,在此基础上又加了一截。为什么这里必须打开SLUB_DEBUG呢?

2.1K10

深度解析 slab 内存池回收内存以及销毁全流程

= READ_ONCE(c->tid))); // 如果释放对象所属的 slub (page 表示)正好是 cpu 本地缓存的 slub // 那么直接将对象释放到 cpu 缓存的 slub...new.inuse 表示此时 slub 变为了一个 empty slub,意思就是该 slub 中的对象还没有分配出去,全部在 slub 中 // !...prior 表示由于本次对象的释放,slub 刚刚从一个 full slub 变成了一个 partial slub (意思就是该 slub 中的对象部分分配出去了,部分没有分配出去) /...was_frozen),但是该 slub 刚刚从 full slub 变为了 partial slub,需要放入 cpu-> partial 列表中 // 2: 该 slub 原来就在 cpu...partial 列表并且 slub 刚刚从 full slub 变为 partial slub // 则将 slub 插入到 kmem_cache_node 中 if (!

27820

Linux 操作系统学习看过来!

Linux阅码场 操作系统堪称是IT皇冠上的明珠,Linux阅码场专注Linux操作系统内核研究, 它的文章云集了国内众多知名企业一线工程师的心得,畅销著作有《linux设备驱动开发详解 》等。...Linux阅码场精选文章汇总: 关于Linux学习方法: 迭代螺旋法——关于Linux学习方法的血泪建议 纪念金庸先生——程序员的武侠世界 ---- Linux任督二脉之进程管理 郭健:Linux进程调度技术的前世今生之...论打通Linux进程和内存管理任督二脉 宋宝华: Linux僵尸进程可以被“杀死”吗?...4分钟理解Linux为什么不是一个硬实时的操作系统 宋宝华:关于Linux进程优先级数字混乱的彻底澄清 有关微内核OS史上最透彻一篇 - 写于华为鸿蒙发布一周之际 被神话的Linux, 一文带你看清Linux...宋牧春:多图详解Linux内存分配器slub 宋牧春:Linux内核slab内存的越界检查——SLUB_DEBUG 郭健:Linux内存逆向映射(reverse mapping)技术的前世今生 谢宝友:

1.5K20

深度解读 Linux 内核级通用内存池 —— kmalloc 体系

而在被大规模运用的服务器 Linux 操作系统中,slab allocator 体系采用的是 slub 实现,所以本文我们还是以 slub 实现来讨论。...ifdef CONFIG_SLUB // slub 最大支持分配 2页 大小的对象,对应的 kmalloc 内存池中内存块尺寸最大就是 2页 // 超过 2页 大小的内存块直接向伙伴系统申请 #define...关于 alloc_pages 函数的详细内容,感兴趣的同学可以回看下笔者之前的文章 《深入理解 Linux 物理内存分配全链路实现》。...KMALLOC_MAX_CACHE_SIZE 在 slub 的实现中,配置为 8K 大小,也就是说在 slub 的实现中,向 kmalloc 内存池申请的内存块超过了 8K 就会直接走伙伴系统。...#ifdef CONFIG_SLUB // slub 最大支持分配 2页 大小的对象,对应的 kmalloc 内存池中内存块尺寸最大就是 2页 // 超过 2页 大小的内存块直接向伙伴系统申请 #define

51830

Linux 内存分配流程及 kmalloc 解析

手把手教你分析 Linux 启动流程 上一次咱们分析了 Linux 的启动流程和初始化流程,今天主要分析一下内存方面的初始化和常见的内存分配方式。...start_kernel |--->mm_init |--->mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab...补充: 1、基于 slab 分配器,出现了 slob 和 slub 分配器。...在多核大系统大内存中,一般使用 slub 分配器,在极小的嵌入式系统中,一般使用 slob 分配器(只有600多行代码)。...2、有的人可能知道 Linux 有一个 bootmem 分配器,这个是在Linux初始化过程中的一个临时分配器,他会在 setup_arch 函数中初始化,然后在 mm_init 中关掉,只是在伙伴系统出现之前的临时使用

2.5K10

图解 | Linux内存性能优化核心思想

hi,大家好,今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象内存分配最重要的算法,文章分析了内存分配的各种性能问题...Linux内核的slab来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。...然而标准的slab实现太复杂且维护开销巨大,因此便分化出了更加小巧的slub,因此本文讨论的就是slub,后面所有提到slab的地方,指的都是slub。...这个设计思想同样作用于slab,就是Linux内核的slub实现,现在可以给出概念和解释了。 Linux kernel slab cache:一个分为3层的对象cache模型。...Linux内核对伙伴系统针对单一页面的分配需求采取的批量分配“每CPU单一页面缓存”的方式!每一个CPU拥有一个单一页面缓存池,需要单一页面的时候,可以无需加锁从当前CPU对应的页面池中获取页面。

93640
领券