Slob中kmalloc的实现
Slob是一种Linux内存分配器,管理了堆的分配算法。
在内核态或用户态的malloc,kmallc都要用到slob
废话少说,看代码
static inline void *kmalloc(size_t size, int flags)
{
return __kmalloc(size, flags);//调用__kmalloc
}
void *__kmalloc(size_t size, gfp_t gfp)
{
slob_t *m;
bigblock_t *bb;
unsigned long flags;
if (size < PAGE_SIZE - SLOB_UNIT) { //判断申请的内存是否小于一个page的大小,SLOB_UNIT 是slob单链表结构
m = slob_alloc(size + SLOB_UNIT, gfp, 0);//分配slab
return m ? (void *)(m + 1) : 0;
}
bb = slob_alloc(sizeof(bigblock_t), gfp, 0);// 大于一个page的内存申请
if (!bb)
return 0;
bb->order = get_order(size);
bb->pages = (void *)__get_free_pages(gfp, bb->order);
if (bb->pages) {
spin_lock_irqsave(&block_lock, flags);
bb->next = bigblocks;
bigblocks = bb;
spin_unlock_irqrestore(&block_lock, flags);
return bb->pages;
}
slob_free(bb, sizeof(bigblock_t));
return 0;
}
关于slob_alloc的定义在:
static void *slob_alloc(size_t size, gfp_t gfp, int align)
{
slob_t *prev, *cur, *aligned = 0;
int delta = 0, units = SLOB_UNITS(size);
unsigned long flags;
spin_lock_irqsave(&slob_lock, flags);
prev = slobfree;
for (cur = prev->next; ; prev = cur, cur = cur->next) {//遍历链表找到合适的slob
if (align) { //SLOB我们传入的都是0
aligned = (slob_t *)ALIGN((unsigned long)cur, align);
delta = aligned - cur;
}
if (cur->units >= units + delta) { /* room enough? */ //略过
if (delta) { /* need to fragment head to align? */
aligned->units = cur->units - delta;
aligned->next = cur->next;
cur->next = aligned;
cur->units = delta;
prev = cur;
cur = aligned;
}
if (cur->units == units) /* exact fit? */ //请求的和当前的正好相等
prev->next = cur->next; /* unlink *//把匹配的这块从链表中取出来
else { /* fragment */ //没有正好匹配的情况?(大多数情况下>的)
prev->next = cur + units;
prev->next->units = cur->units - units;
prev->next->next = cur->next;
cur->units = units; //同理在当前的链表减个出来
}
slobfree = prev;
spin_unlock_irqrestore(&slob_lock, flags);
return cur;
}
if (cur == slobfree) {
spin_unlock_irqrestore(&slob_lock, flags);
if (size == PAGE_SIZE) /* trying to shrink arena? */
return 0;
cur = (slob_t *)__get_free_page(gfp);
if (!cur)
return 0;
slob_free(cur, PAGE_SIZE);
spin_lock_irqsave(&slob_lock, flags);
cur = slobfree;
}
}
}
Slob内存分配比较简单,只有两条链表来分配可用的内存,没有涉及到复杂的优先级排队,调度的策略,适合小系统使用 slab是更复杂的分配。
Slob中kmalloc的实现相关推荐
- Could not generate persistent MAC address
本文永久链接: https://www.xtplayer.cn/linux/network/could-not-generate-persistent-mac-address/ 问题现象 在 dock ...
- linux中的 slab/slob/slub
很久很久以bai前:一个叫做Mark Hemment的哥儿们du写了Slab.在接下来的一些年里zhi,其他人对Slab进行了完善dao.一年半以前,SLOB问世了.SLOB的目标是针对嵌入式系统的, ...
- 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】
转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...
- kmalloc最大能申请多少内存?
1. 概述 本文主要分析kmalloc接口申请内存的大小情况,用于记录kmalloc分配内存的过程. 内核版本:Linux 4.9 2.分析记录 针对kmalloc最大能申请多少内存,网上众说纷纭,意 ...
- LINUX内核狂想曲之SLOB分配器
LINUX内核狂想曲 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Universit ...
- Linux Slob分配器(一)--概述
水平有限,描述不当之处还请指出,转载请注明出处 http://blog.csdn.net/vanbreaker/article/details/7705202 Slob分配器相较Slab和Slub分配 ...
- STM32 中malloc实际调用
/* Variables */ extern int errno; register char * stack_ptr asm("sp"); //获得当前堆的地址/* Functi ...
- linux内核中分配4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别
Table of Contents kmalloc() kzalloc() vmalloc() 总结 内核中的内存申请:kmalloc.vmalloc.kzalloc.kcalloc.get_free ...
最新文章
- 如何能够得到灵敏度更高的150kHz导航信号检测板?
- 祝各位节日快乐!20151111
- Python中的迭代遍历 for in
- python图例重复显示_matplotlib中的legend()——用于显示图例
- 清华大学计算机组成原理视频百度云,计算机组成原理第48讲:
- BZOJ 1432 [ZJOI2009]Function
- GitGitHub语法大全
- 前端学习(2529):搭建中央管理
- 软件设计师学习1——计算机系统知识
- Mybatis_day3_Mybatis的动态SQL
- 阿甘博客文章写法与教学方法
- Android UI控件之Gallery(拖动效果) --拖动式图片浏览
- cocos2d-x自制工具07:打印cocos2d-x的节点树
- 红米k40关闭开发者模式教程介绍
- pyodbc linux 乱码,python-无法在Linux上安装pyodbc
- 叮咚叮咚,京东叮咚音箱Skill开发之路
- 扫描二维码下载app
- 多媒体开发之---开源库ffmeg的log之子解析
- 企业如何申请测绘资质?需要那些人员材料?
- const与指针用法