栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux内核-内存管理slub分配器

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux内核-内存管理slub分配器

slub分配器使用

kmem_cache数据结构

slab分配器的对象单位–>管理自己的kmem_cache–>kmem_cache存在于slab_caches双链表中

kmem_cache里的一些小slab对象–>存在于“kmem_cache_node->partial”中 --> 每个node对应于kmem_cache_node数组项

kmem_cache里的另一部分小slab对象–>存在于“kmem_cache_cpu->partial”中

slab中没有被使用的对象称为空闲对象(free object),同一slab中的所有空闲对象被串成了一个单项链表(freelist),每个空闲对象的首地址 + kmem_cache->offset处会保存下一个空闲对象的地址,这样就形成了一个单链表

分配对象

有了上面的kmem_cache结构体就可以通过kmem_cache_alloc()分配对象在分配时有如下情况:

  • fast path:直接从本地cpu缓存中的freelist拿到可用object
  • slow path:本地cpu缓存中的freelist为NULL,但本地cpu缓存中的partial中有未满的slab
  • very slow path:本地cpu缓存中的freelist为NULL,且本地cpu缓存中的partial也无slab可用。

内存管理是按大小块管理的具体可看cat /proc/slainfo 大小相同的会物理相邻

专用高速缓存是由kmem_cache_creat()函数创建的,专门使用与特殊类型的对象

普通高速缓存使用kmalloc()进行分配

释放对象

函数定义:
struct kmem_cache *kmem_cache_create( const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)(void*));

int kmem_cache_destroy( struct kmem_cache *cachep);


void* kmem_cache_alloc(struct kmem_cache* cachep, gfp_t flags);

void kmem_cache_free(struct kmem_cache* cachep,  void* objp);

常见的pwn题使用kmem_cache_alloc_trace如下:(ctf linux内核-内存管理slub分配器)

int __cdecl sudrv_init()
{
  int v0; // eax
  __int64 v1; // rdi

  printk("x016SUCTF 2019 SUDrivern");
  v0 = _register_chrdev(0xE9LL, 0LL, 0x100LL, "meizijiutql", &fops);
  v1 = kmalloc_caches[12];
  su_fd = v0;
  su_buf = (char *)kmem_cache_alloc_trace(v1, 0x480020LL, 0x1000LL);// 
                                                // kmem_cache_alloc_trace(cachep, flags,size);
  return 0;
}

kmem_cache_alloc_trace函数就是kmem_cache_create + kmem_cache_alloc这样就通过slub分配器分配了一块内存了

参考资料

https://blog.csdn.net/u012489236/article/details/108188375(写的很容易理解)

https://zhuanlan.zhihu.com/p/166649492

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838740.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号