文档详情

linux slab的源代码.doc

发布:2017-08-24约5.17万字共46页下载文档
文本预览下载声明
LINUX 源代码分析 slab.c LINUX 2.2.5版本内核内存管理 操作系统管理系统所有的物理空间, 现代大多数操作系统都采取多级管理, 即页面级分配与内核内存分配。就LINUX2-2-5 版本而言,页面级的分配是采用Buddy 算法,而内核内存分配是采用面向对象的Slab分配原则。 该分配原则高效,可以大大提高内存的利用率以及硬件cache级系统总线的利用率。它在Solaris2-4中已被采用。 (见”UNIX Kernel” 一书。) 面向对象的Slab分配原则主要为以下几点: 面向对象的思想: 将被申请的空间视为对象,使用构造函数出始化对象,然后由用户使用对象(即所需的物理空间),当需要回收空间时,使用析构函数析构对象,在释放给系统。 Slab 块 Slab 块是内核内存分配与页面级分配的接口。每个slab块的大小都为页面大小的整数倍, 由若干对象组成。系统一次分配给用户的内存为一个slab块,回收时也为一个slab块 对象缓存区: 每一类对象都有自己的缓存区。缓存区按slab块组建。缓存区的管理者纪录该类对象的所有信息,包括对象的大小,性质(如是否用于dma操作),slab的各项参数及使用情况等。具体详见数据结构说明。 着色机制: 所谓着色机制是指,按照对象要求的对齐字节数,分配合适的着色区(即偏移量),以使该类对象有良好的地址分布,便于硬件操作,从而带来较高的硬件cache 和系统总线使用率。 具体实现如下: 重要的数据结构 kmem_bufctl_t 说明 : 管理对象的数据类型 /* Bufctls are used for linking objs within a slab, identifying what slab an obj * is in, and the address of the associated obj (for sanity checking with off-slab * bufctls). What a bufctl contains depends upon the state of the obj and * the organisation of the cache. */ typedef struct kmem_bufctl_s { union { struct kmem_bufctl_s *buf_nextp; //用于空闲对象 // (保存后继空闲对象) kmem_slab_t *buf_slabp; // 用于活动的不规整对象 // (保存所在slab块的指针) void * buf_objp; //用于活动的规整对象 // (保存该对象的地址) } u; } kmem_bufctl_t; kmem_slab_t 说明 : 用于管理 slab 块的数据类型 typedef struct kmem_slab_s { struct kmem_bufctl_s *s_freep; //指向第一个空闲对象 struct kmem_bufctl_s *s_index; // 指向规整对象链表, //对象不规整时, 为NULL unsigned long s_magic; // 用于判断该slab块是否已被销毁 // 由下面两个宏赋值 // #define SLAB_MAGIC_ALLOC 0xA5C32F2BUL // #define SLAB_MAGIC_DESTROYED 0xB2F23C5AUL unsigned long s_inuse; // 活动对象的数目 struct kmem_slab_s *s_nextp; // 用于双向链表 struct kmem_slab_s *s_prevp; void *s_mem; // 该slab块中第一个对象的地址 unsigned long s_offset: SLAB_OFFSET_BITS, 16 // 用于地址对齐 s_dma:1; // 是否用于dm
显示全部
相似文档