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

linux内存管理slab算法之slab初始化

业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码...kmalloc函数就是从slab分配的。整体结构就是如下图,其中一个slab包含1到多个页面,slab管理结构可能在页面上,也可能从其它kmem_cache上动态分配的。    ...每个slab包含页面的阶 /* force GFP flags, e.g....partial list first, better asm code *///部分空slab类型链表 struct list_head slabs_full; //满slab类型链表 struct..., NULL); } //slab早期初始化结束 slab_early_init = 0; while (sizes->cs_size !

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

Linux内存管理 - slab分配器

Linux内存管理是一个非常复杂的子系统,要完全说清的话估计要一本书的篇幅。但Linux内存管理可以划分成多个部分来阐述,这篇文章主要介绍slab算法。...Linux有个叫伙伴系统的分配算法,这个算法主要解决分配连续个内存页的问题。...为了解决小内存分配问题,Linux使用了slab分配算法。 相关数据结构 slab算法有两个重要的数据结构,一个是kmem_cache_t,另外一个是slab_t。...的空闲对象链表,然后根据slab的使用情况移动slab到合适的列表。...1) 如果slab所有对象都被释放完时,把slab放置到slab_free列表。2) 如果对象所在的slab原来在slab_full,那么就把slab移动到slab_partial

2.3K51

Linux内核内存管理算法Buddy和Slab

为了避免出现这种情况,Linux内核引入了伙伴系统算法(Buddy system)。...假设要申请一个256个页框的块,先从256个页框的链表查找空闲块,如果没有,就去512个页框的链表找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表。...如果512个页框的链表仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。...SlabLinux,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...一个slab缓存池就像是一箱牛奶,一箱牛奶中有很多瓶牛奶,每瓶牛奶就是一个object。分配内存的时候,就相当于从牛奶箱拿一瓶。总有拿完的一天。当箱子空的时候,你就需要去超市再买一箱回来。

3.4K73

Linux内核内存管理算法Buddy和Slab

为了避免出现这种情况,Linux内核引入了伙伴系统算法(Buddy system)。...假设要申请一个256个页框的块,先从256个页框的链表查找空闲块,如果没有,就去512个页框的链表找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表。...如果512个页框的链表仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。页框块在释放时,会主动将两个连续的页框块合并为一个较大的页框块。...SlabLinux,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。...一个slab缓存池就像是一箱牛奶,一箱牛奶中有很多瓶牛奶,每瓶牛奶就是一个object。分配内存的时候,就相当于从牛奶箱拿一瓶。总有拿完的一天。当箱子空的时候,你就需要去超市再买一箱回来。

2K30

伙伴系统和slab机制

伙伴系统 Linux内核采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统,用到了四级页表。...Linux采用4KB大小的页框作为标准的内存分配单元。 在实际应用,经常需要分配一组连续的页框,而频繁地申请和释放不同大小的连续页框,必然导致在已分配页框的内存块中分散了许多小块的空闲页框。...为了避免出现这种情况,Linux内核引入了伙伴系统算法(buddy system)。...slab机制 slabLinux操作系统的一种内存分配机制。...Linuxslab 可有三种状态: 满的:slab 的所有对象被标记为使用。 空的:slab 的所有对象被标记为空闲。 部分:slab 的对象有的被标记为使用,有的被标记为空闲。

2.3K11

SLUB结构体创建及创建slab分析

在上一篇文章我们通过一个简单的例子大概描述了如何创建SLUB缓存,如何分配一个object。本文详细描述下涉及的结构体,从结构体的描述中就可以大概理解slub的工作原理了。...很多object,那各个Object之间是如何联系的,就是通过offset变量+一个object的大小就可以获取下一个Object的地址 oo: 低16位代表一个slabobject的个数,高16位代表一个...CONFIG_SLUB unsigned long nr_partial; struct list_head partial; #endif }; nr_partial: nodeslab...在这里usersize=useroffset=0的 调用__kmem_cache_alias函数去检查传递的大小和一些flag是否可以和系统已经创建的slab匹配上,如果匹配上则就不用重新申请了,直接使用别名就行...error; if (alloc_kmem_cache_cpus(s)) return 0; } ilog2的就是数学上的Log2(8)=3,则kmem_cache_nodepartital

1.8K10

Linux内核的内存管理与漏洞利用案例分析

本文主要介绍Buddy System、Slab Allocator的实现机制以及现实的一些漏洞利用方法,从攻击者角度加深对Linux内核内存管理机制的理解。...Linux内核的伙伴系统块大小为一页,通常是4096字节。最大的order一般是10,即MAX_ORDER为11。...因此Linux引入了Slab分配器,加速对object的分配和释放速度,同时也减少碎片空间。 最初接触的时候心里通常有个大大的问号:Slab是什么?...其中partial是Linux内核可插拔式通用双链表结构,使用内核双链表的接口进行操作。nr_partial表示partial双链表的元素个数,即slab的个数。.../201803/4a471520078976.png 调试 slab分配器是如此复杂,因此Linux内核中提供了很多调试措施,开启特定的调试编译选项后可以在object前后加上red zone检测越界,

1.1K20

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

使用Buddy算法的的应用有很多,其中Linux内核就是一个,此外jemalloc也是使用Buddy技术的一个现代内存分配器。 Linux内核的伙伴系统块大小为一页,通常是4096字节。...因此Linux引入了Slab分配器,加速对object的分配和释放速度,同时也减少碎片空间。 最初接触的时候心里通常有个大大的问号:Slab是什么?...partial指向的page有以下特点: next指向下一个slab(page) freelist指向slab第一个空闲object inuse = slab已使用的object个数 frozen...其中partial是Linux内核可插拔式通用双链表结构,使用内核双链表的接口进行操作。nr_partial表示partial双链表的元素个数,即slab的个数。...partial->next指向的page结构,用于该结构的page有如下特点: frozon = 0 freelist指向slab第一个空闲object inuse表示对应slab使用的object

2.3K00
领券