Linux1.0 kmalloc kfree_s分析

原创 2015年11月20日 20:53:16
                        kmalloc分析
    kmalloc内存分配函数是Linux内核中动态内存管理中非常重要的函数,在这篇博客中主要来分析内核当中动态内存的分配和释放过程。
    首先来介绍kmalloc和kfree_s的基本原理,在Linux内核当中内存

的管理采用的是分页管理方式,即以页为单位,每页的大小4KB。在系
统当中内核每次对动态内存的申请大小是不确定的,就是你可以申请
的大小可以是32KB,64KB,128KB,,4080KB,现暂且将这个大小
称为size,对于每种大小的内存申请,如果已有的空闲块被用完,则内核申请一页新的内存(4KB),在该页内存中的起始处,会存放一个页描述符,页描述符中记录该内存块中分成的小块的使用情况以及下一块用来分配这样size大小的物理块,然后将该页的剩下内存按照申请块的大小和每块的块头平均分成若干块,在这里的块头是用来记录各块之间的链接关系,块头的下部分内存才是被kmalloc分配出去的内存。
介绍了分配的基本原理之后,再来介绍内核当中关于kmalloc的几个重要结构体:
1、每块内存的块头
struct block_header {
unsigned long bh_flags; /物理页中分配的块的状态/
union {
unsigned long ubh_length; /被使用时记录实际使用大小/
struct block_header fbh_next; /空闲时下一个块的大小*/
} vp;
};
2、分配size大小的物理块页描述符
struct page_descriptor {
struct page_descriptor *next;
struct block_header *firstfree;
int order; /这一页分配的是多大块号/
int nfree; /一页中空闲块的数量/
};
3、记录内核中分配的内存大小以及一页内存中可以分配该种size大小的块的数量,同时记录了也记录了分配该size大小的物理页的地址
struct size_descriptor {
struct page_descriptor firstfree; /分配size大小块的物理页地址*/
int size;
int nblocks; /一页总共能分配多少块/

    int nmallocs;                       /*已经使用size大小的块有多少块*/
    int nfrees;
    int nbytesmalloced;                 /*实际分配的字节数*/
    int npages;                         /*使用了多少页*/
};
4、struct size_descriptor的一个数组,初始化各种可以分配的大小以及一页可以分配的小块的数量。
struct size_descriptor sizes[] = { 
    { NULL,  32,127, 0,0,0,0 },
    { NULL,  64, 63, 0,0,0,0 },
    { NULL, 128, 31, 0,0,0,0 },
    { NULL, 252, 16, 0,0,0,0 },
    { NULL, 508,  8, 0,0,0,0 },
    { NULL,1020,  4, 0,0,0,0 },
    { NULL,2040,  2, 0,0,0,0 },
    { NULL,4080,  1, 0,0,0,0 },
    { NULL,   0,  0, 0,0,0,0 }
};

这几个结构体在内存当中的关系可以用下图来表示

这里写图片描述

            分配之后就是内存块的释放了,当给出一个释放地址时,可以算出该地址所在的物理块然后取物理块开始处的页描述符,
                首先将释放的块添加到该页的空闲块链的链首,然后将所在的物理页放在size大小对应的物理页链表的链首,方便
                下次分配时寻找空闲块。如果所在的整个物理块是空闲的则将整个物理块释放。

详细的代码注释:https://github.com/wanggx/Linux1.0
版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux kmalloc/kfree 源码解读

kmalloc/kfree用于划分和回收内核空间低区内存的方法。改组方法没有直接通过伙伴系统进行内存的划分,通过slab算法进行分配的。同时也为每个CPU提供一个阵列缓存,用于提高分配效率。下面对改组...
  • tq02h2a
  • tq02h2a
  • 2008年12月16日 20:21
  • 6086

kmalloc kfree学习笔记

slub中的kmalloc和kfree学习笔记  2.6.26中的内存管理大概分为3个层次 SLUB,伙伴系统和ZONE,其中SLUB在最高层,这里通过分析kmalloc和kfree来分析SLUB的模...

kmalloc/kfree封装代码

  • 2015年12月23日 10:14
  • 2KB
  • 下载

内存管理器(十二)kernel内存管理----kmalloc/kfree

内存管理器(十二)kernel内存管理----kmalloc/kfree 前言 上一篇说了页的获取与释放,既然是内核内存管理,内核自然也有自己的一套内存分配与释放函数。go on! kmalloc( ...

kmalloc kfree学习笔记

2.6.26中的内存管理大概分为3个层次SLUB,伙伴系统和ZONE,其中SLUB在最高层,这里通过分析kmalloc和kfree来分析SLUB的模型,在内存管理中还有NUMA系统,但是NUMA不是必...

slub中的kmalloc和kfree学习笔记

slub中的kmalloc和kfree学习笔记     2.6.26中的内存管理大概分为3个层次 SLUB,伙伴系统和ZONE,其中SLUB在最高...

slub中的kmalloc和kfree学习笔记

2.6.26中的内存管理大概分为3个层次 SLUB,伙伴系统和ZONE,其中SLUB在最高层,这里通过分析kmalloc和kfree来分析SLUB的模型,在内存管理中还有NUMA系统,但是NUMA不是...

kmalloc/kfree,vmalloc/vfree函数用法和区别

1.kmalloc 1>kmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零. tiger说明:在用kmalloc申请函数后,要对起清零 用mem...

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

我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free()。注意:动态申请的内存使用完后必须要释放,否则会造成...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux1.0 kmalloc kfree_s分析
举报原因:
原因补充:

(最多只允许输入30个字)