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的实现相关推荐

  1. Could not generate persistent MAC address

    本文永久链接: https://www.xtplayer.cn/linux/network/could-not-generate-persistent-mac-address/ 问题现象 在 dock ...

  2. linux中的 slab/slob/slub

    很久很久以bai前:一个叫做Mark Hemment的哥儿们du写了Slab.在接下来的一些年里zhi,其他人对Slab进行了完善dao.一年半以前,SLOB问世了.SLOB的目标是针对嵌入式系统的, ...

  3. 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】

    转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...

  4. kmalloc最大能申请多少内存?

    1. 概述 本文主要分析kmalloc接口申请内存的大小情况,用于记录kmalloc分配内存的过程. 内核版本:Linux 4.9 2.分析记录 针对kmalloc最大能申请多少内存,网上众说纷纭,意 ...

  5. LINUX内核狂想曲之SLOB分配器

    LINUX内核狂想曲 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Universit ...

  6. Linux Slob分配器(一)--概述

    水平有限,描述不当之处还请指出,转载请注明出处 http://blog.csdn.net/vanbreaker/article/details/7705202 Slob分配器相较Slab和Slub分配 ...

  7. STM32 中malloc实际调用

    /* Variables */ extern int errno; register char * stack_ptr asm("sp"); //获得当前堆的地址/* Functi ...

  8. linux内核中分配4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  9. Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

    Table of Contents kmalloc() kzalloc() vmalloc() 总结 内核中的内存申请:kmalloc.vmalloc.kzalloc.kcalloc.get_free ...

最新文章

  1. 如何能够得到灵敏度更高的150kHz导航信号检测板?
  2. 祝各位节日快乐!20151111
  3. Python中的迭代遍历 for in
  4. python图例重复显示_matplotlib中的legend()——用于显示图例
  5. 清华大学计算机组成原理视频百度云,计算机组成原理第48讲:
  6. BZOJ 1432 [ZJOI2009]Function
  7. GitGitHub语法大全
  8. 前端学习(2529):搭建中央管理
  9. 软件设计师学习1——计算机系统知识
  10. Mybatis_day3_Mybatis的动态SQL
  11. 阿甘博客文章写法与教学方法
  12. Android UI控件之Gallery(拖动效果) --拖动式图片浏览
  13. cocos2d-x自制工具07:打印cocos2d-x的节点树
  14. 红米k40关闭开发者模式教程介绍
  15. pyodbc linux 乱码,python-无法在Linux上安装pyodbc
  16. 叮咚叮咚,京东叮咚音箱Skill开发之路
  17. 扫描二维码下载app
  18. 多媒体开发之---开源库ffmeg的log之子解析
  19. 企业如何申请测绘资质?需要那些人员材料?
  20. const与指针用法

热门文章

  1. 第10届全国大学生GIS技能大赛下午试题详解(下)附练习数据
  2. excel 2010 多个窗口打开
  3. windows10 vagrant+VirtualBox安装docker
  4. 达标式减量策略又一例证(STRASS研究)
  5. 图神经网络(三)GCN的变体与框架(4)GNN的通用框架
  6. C++开发五子棋游戏,再一次成功挑战超级人工智能AI
  7. 高数精髓——极限存在、连续、可导、可微和可积之间的联系
  8. linux之gzip,bzip2命令
  9. linux命令模式和图形界面切换
  10. 剑指Offer——翻转英文句子中的单词顺序