欢迎来到天天文库
浏览记录
ID:55550629
大小:197.50 KB
页数:46页
时间:2020-05-16
《LINUX 源代码分析-内存管理.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、....................LINUX源代码分析..........-------------slab.c报告人:李娜混合973LINUX2.2.5版本内核内存管理操作系统管理系统所有的物理空间,现代大多数操作系统都采取多级管理,即页面级分配与内核内存分配。就LINUX2-2-5版本而言,页面级的分配是采用Buddy算法,而内核内存分配是采用面向对象的Slab分配原则。该分配原则高效,可以大大提高内存的利用率以及硬件cache级系统总线的利用率。它在Solaris2-4中已被采用。(见”UNIXKernel”
2、一书。)面向对象的Slab分配原则主要为以下几点:1.面向对象的思想:将被申请的空间视为对象,使用构造函数出始化对象,然后由用户使用对象(即所需的物理空间),当需要回收空间时,使用析构函数析构对象,在释放给系统。2.Slab块Slab块是内核内存分配与页面级分配的接口。每个slab块的大小都为页面大小的整数倍,由若干对象组成。系统一次分配给用户的内存为一个slab块,回收时也为一个slab块3.对象缓存区:每一类对象都有自己的缓存区。缓存区按slab块组建。缓存区的管理者纪录该类对象的所有信息,包括对象的大小,性质(如是
3、否用于dma操作),slab的各项参数及使用情况等。具体详见数据结构说明。4.着色机制:所谓着色机制是指,按照对象要求的对齐字节数,分配合适的着色区(即偏移量),以使该类对象有良好的地址分布,便于硬件操作,从而带来较高的硬件cache和系统总线使用率。具体实现如下:l重要的数据结构Økmem_bufctl_t说明:管理对象的数据类型/*Bufctl'sareusedforlinkingobjswithinaslab,identifyingwhatslabanobj*isin,andtheaddressoftheassoc
4、iatedobj(forsanitycheckingwithoff-slab*bufctls).Whatabufctlcontainsdependsuponthestateoftheobjand*theorganisationofthecache.*/typedefstructkmem_bufctl_s{union{structkmem_bufctl_s*buf_nextp;//用于空闲对象//(保存后继空闲对象)kmem_slab_t*buf_slabp;//用于活动的不规整对象//(保存所在slab块的指针)void
5、*buf_objp;//用于活动的规整对象//(保存该对象的地址)}u;}kmem_bufctl_t;Økmem_slab_t说明:用于管理slab块的数据类型typedefstructkmem_slab_s{structkmem_bufctl_s*s_freep;//指向第一个空闲对象structkmem_bufctl_s*s_index;//指向规整对象链表,//对象不规整时,为NULLunsignedlongs_magic;//用于判断该slab块是否已被销毁//由下面两个宏赋值//#defineSLAB_MAGI
6、C_ALLOC0xA5C32F2BUL//#defineSLAB_MAGIC_DESTROYED0xB2F23C5AULunsignedlongs_inuse;//活动对象的数目structkmem_slab_s*s_nextp;//用于双向链表structkmem_slab_s*s_prevp;void*s_mem;//该slab块中第一个对象的地址unsignedlongs_offset:SLAB_OFFSET_BITS,16//用于地址对齐s_dma:1;//是否用于dma操作}kmem_slab_t;Økmem_
7、cache_t说明:管理缓存区的数据类型structkmem_cache_s{kmem_slab_t*c_freep;//第一个部分空闲的slab块unsignedlongc_flags;//纪录缓存区的属性/*constantflags*/unsignedlongc_offset;//on_slab时为kmem_bufctl_t相对于//它所指的对象的偏移量//off_slab时为相邻两个对象之间的偏移量unsignedlongc_num;//每个slab块可容纳的对象数量unsignedlongc_magic;//用
8、于检错unsignedlongc_inuse;/*keptatzero*/kmem_slab_t*c_firstp;//缓存区中的第一个slab块kmem_slab_t*c_lastp;//最后一个slab块spinlock_tc_spinlock;//当访问可变成员变量时使用,//避免同时访问同一个变量unsign
此文档下载收益归作者所有