1 / 46
文档名称:

LINUX 源代码分析-内存管理.doc

格式:doc   大小:197KB   页数:46页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

LINUX 源代码分析-内存管理.doc

上传人:wwlgqnh 2020/6/5 文件大小:197 KB

下载得到文件列表

LINUX 源代码分析-内存管理.doc

相关文档

文档介绍

文档介绍:....................LINUX源代码分析..........-------------:,现代大多数操作系统都采取多级管理,即页面级分配与内核内存分配。就LINUX2-2-5版本而言,页面级的分配是采用Buddy算法,而内核内存分配是采用面向对象的Slab分配原则。该分配原则高效,可以大大提高内存的利用率以及硬件cache级系统总线的利用率。它在Solaris2-4中已被采用。(见”UNIXKernel”一书。)面向对象的Slab分配原则主要为以下几点:面向对象的思想:将被申请的空间视为对象,使用构造函数出始化对象,然后由用户使用对象(即所需的物理空间),当需要回收空间时,使用析构函数析构对象,在释放给系统。Slab块Slab块是内核内存分配与页面级分配的接口。每个slab块的大小都为页面大小的整数倍,由若干对象组成。系统一次分配给用户的内存为一个slab块,回收时也为一个slab块对象缓存区:每一类对象都有自己的缓存区。缓存区按slab块组建。缓存区的管理者纪录该类对象的所有信息,包括对象的大小,性质(如是否用于dma操作),slab的各项参数及使用情况等。具体详见数据结构说明。着色机制:所谓着色机制是指,按照对象要求的对齐字节数,分配合适的着色区(即偏移量),以使该类对象有良好的地址分布,便于硬件操作,从而带来较高的硬件cache和系统总线使用率。具体实现如下:重要的数据结构kmem_bufctl_t说明:管理对象的数据类型/*Bufctl'sareusedforlinkingobjswithinaslab,identifyingwhatslabanobj*isin,andtheaddressoftheassociatedobj(forsanitycheckingwithoff-slab*bufctls).Whatabufctlcontainsdependsuponthestateoftheobjand*anisationofthecache.*/typedefstructkmem_bufctl_s{ union{ structkmem_bufctl_s *buf_nextp;//用于空闲对象//(保存后继空闲对象) kmem_slab_t *buf_slabp; //用于活动的不规整对象//(保存所在slab块的指针) void* buf_objp;//用于活动的规整对象//(保存该对象的地址) }u;}kmem_bufctl_t;kmem_slab_t说明:用于管理slab块的数据类型typedefstructkmem_slab_s{ structkmem_bufctl_s *s_freep;//指向第一个空闲对象 structkmem_bufctl_s *s_index;//指向规整对象链表,//对象不规整时,为NULL unsignedlong s_magic;//用于判断该slab块是否已被销毁//由下面两个宏赋值//#define SLAB_MAGIC_ALLOC 0xA5C32F2BUL //#define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL unsignedlong s_inuse;//活动对象的数目 structkmem_slab_s *s_nextp;//用于双向链表 structkmem_slab_s *s_prevp; void *s_mem; //该slab块中第一个对象的地址 unsignedlong s_offset:SLAB_OFFSET_BITS,16//用于地址对齐 s_dma:1;//是否用于dma操作}kmem_slab_t;kmem_cache_t说明:管理缓存区的数据类型structkmem_cache_s{ kmem_slab_t *c_freep; //第一个部分空闲的slab块 unsignedlong c_flags; //纪录缓存区的属性/*constantflags*/ unsignedlong c_offset;//on_slab时为kmem_bufctl_t相对于//它所指的对象的偏移量//off_slab时为相邻两个对象之间的偏移量 unsignedlong c_num; //每个slab块可容纳的对象数量 unsignedlong c_magic;//用于检错 unsignedlong c_inuse; /*keptatzero*/ kmem_slab_t *c_firstp; //缓存区中的第一个slab块 kmem_slab_t *c_lastp; //最后一个slab块 spinlock_t c_spinl