LINUX源代码分析-内存管理精品资料.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《LINUX源代码分析-内存管理精品资料.doc》由会员分享,可在线阅读,更多相关《LINUX源代码分析-内存管理精品资料.doc(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.LINUX 源代码分析. - slab.c 报告人 : 李娜 混合 973 9730071 LINUX 2.2.5版本内核内存管理操作系统管理系统所有的物理空间, 现代大多数操作系统都采取多级管理, 即页面级分配与内核内存分配。就LINUX2-2-5 版本而言,页面级的分配是采用Buddy 算法,而内核内存分配是采用面向对象的Slab分配原则。 该分配原则高效,可以大大提高内存的利用率以及硬件cache级系统总线的利用率。它在Solaris2-4中已被采用。 (见”UNIX Kernel” 一书。)面向对象的Slab分配原则主要为以下几点:1 面向对象的思想:将被申请的空间视为对象,使用构造
2、函数出始化对象,然后由用户使用对象(即所需的物理空间),当需要回收空间时,使用析构函数析构对象,在释放给系统。2 Slab 块Slab 块是内核内存分配与页面级分配的接口。每个slab块的大小都为页面大小的整数倍, 由若干对象组成。系统一次分配给用户的内存为一个slab块,回收时也为一个slab块3 对象缓存区:每一类对象都有自己的缓存区。缓存区按slab块组建。缓存区的管理者纪录该类对象的所有信息,包括对象的大小,性质(如是否用于dma操作),slab的各项参数及使用情况等。具体详见数据结构说明。4 着色机制:所谓着色机制是指,按照对象要求的对齐字节数,分配合适的着色区(即偏移量),以使该类
3、对象有良好的地址分布,便于硬件操作,从而带来较高的硬件cache 和系统总线使用率。具体实现如下:l 重要的数据结构 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
4、 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 struc
5、t kmem_slab_s struct kmem_bufctl_s*s_freep; /指向第一个空闲对象struct kmem_bufctl_s*s_index; / 指向规整对象链表, /对象不规整时, 为NULLunsigned long s_magic; / 用于判断该slab块是否已被销毁 / 由下面两个宏赋值 / #defineSLAB_MAGIC_ALLOC0xA5C32F2BUL / #defineSLAB_MAGIC_DESTROYED0xB2F23C5AULunsigned long s_inuse; / 活动对象的数目struct kmem_slab_s*s_nextp
6、; / 用于双向链表struct kmem_slab_s*s_prevp;void*s_mem; / 该slab块中第一个对象的地址unsigned long s_offset: SLAB_OFFSET_BITS, 16 / 用于地址对齐 s_dma:1; / 是否用于dma操作 kmem_slab_t; kmem_cache_t说明 : 管理缓存区的数据类型struct kmem_cache_s kmem_slab_t *c_freep;/ 第一个部分空闲的slab块unsigned long c_flags;/ 纪录缓存区的属性 /* constant flags */ unsigned
7、long c_offset; / on_slab 时为kmem_bufctl_t 相对于 /它所指的对象的偏移量 / off_slab 时为相邻两个对象之间的偏移量unsigned long c_num; / 每个slab 块可容纳的对象数量unsigned long c_magic; / 用于检错unsigned long c_inuse;/* kept at zero */kmem_slab_t *c_firstp; / 缓存区中的第一个slab块kmem_slab_t *c_lastp; / 最后一个slab块spinlock_t c_spinlock; / 当访问可变成员变量时使用,
8、/ 避免同时访问同一个变量unsigned long c_growing; / 正在分配内存时, 防止kmem_cache_shrink() / 或kmem_cache_rep() 回收unsigned long c_dflags; / 动态标志size_t c_org_size; / 对象的大小 ( 对其后的值)unsigned long c_gfporder; / 该cache中每个slab 拥有的页面数void (*c_ctor)(void *, kmem_cache_t *, unsigned long); /对象构造函数void (*c_dtor)(void *, kmem_cach
9、e_t *, unsigned long); /对象析构函数unsigned long c_align; / 对齐参数size_t c_colour; / 着色数, 使该类对象具有良好的基址分布size_t c_colour_next; / 当前可着色数unsigned long c_failures;const char *c_name; / 缓存区的名字struct kmem_cache_s *c_nextp; /连接下一个cachekmem_cache_t *c_index_cachep; / 用于SLAB_CLFGS_BUFCTL的情况 / 管理 用于分配s_index 的缓存区;ty
10、pedef struct kmem_cache_s kmem_cache_t; cache_sizes_t说明 : cache_sizes 表成员的数据类型typedef struct cache_sizes size_t cs_size; / number of bytekmem_cache_t*cs_cachep; cache_sizes_t;l 重要的全局变量 cache_sizes 说明 : cache_size表管理所有的通用缓存区, 这些缓存区中的对象大小均为2n . 各缓存区在 kmem_cache_sizes_init() 中分配static cache_sizes_t cac
11、he_sizes = #ifPAGE_SIZE = 4096 32,NULL,#endif 64,NULL, 128,NULL, 256,NULL, 512,NULL,1024,NULL,2048,NULL,4096,NULL,8192,NULL,16384,NULL,32768,NULL,65536,NULL,131072,NULL, / 32 pages are allowed0,NULL; cache_sizes_name说明 : 对应于cache_sizes表中通用缓存区的名字static char *cache_sizes_name = #ifPAGE_SIZE = 4096size
12、-32,#endifsize-64,size-128,size-256,size-512,size-1024,size-2048,size-4096,size-8192,size-16384,size-32768,size-65536,size-131072; cache_cache说明 : 用于管理 分配kmem_cache_t 对象的缓存区, 有部分数据在kmem_cache_init() 赋值.statickmem_cache_tcache_cache = /* freep, flags */kmem_slab_end(&cache_cache), SLAB_NO_REAP,/* off
13、set, num */sizeof(kmem_cache_t),0,/* c_magic, c_inuse */SLAB_C_MAGIC, 0,/* firstp, lastp */kmem_slab_end(&cache_cache), kmem_slab_end(&cache_cache),/* spinlock */SPIN_LOCK_UNLOCKED,/* growing */0,/* dflags */0,/* org_size, gfp */0, 0,/* ctor, dtor, align */NULL, NULL, L1_CACHE_BYTES,/* colour, colou
14、r_next */0, 0,/* failures */0,/* name */kmem_cache,/* nextp */&cache_cache,/* index */NULL,; cache_chain_semstatic struct semaphorecache_chain_sem;说明 : 缓存区管理对象链的访问需要互斥, 该变量用于访问互斥信号量,它被赋值为MUTEX, 在semaphore.h 中定义宏 #define MUTEX (struct semaphore) ATOMIC_INIT(1), 0, NULL ) #define ATOMIC_INIT(i) (i) 可见
15、该信号量的确为互斥信号量. clock_searchpstatickmem_cache_t*clock_searchp = &cache_cache; 说明 : 在 kmem_cache_reap() 函数回收空闲空间时, 采用类似于时钟算法回收空间.使所有分配的页面公平竞争. cache_slabpstatic kmem_cache_t*cache_slabp = NULL;说明 : off_slab时, 需要从另外的独立的缓存区分配该slab块的管理对象 kmem_slab_t这个缓存就由cache_slabp 来管理 bufctl_limitstatic unsigned long bu
16、fctl_limit = 0;纪录某slab块可分配对象的上限, kmem_cache_create() 中用于给每个slab块分配合适的页面数 slab_break_gfp_orderstatic int slab_break_gfp_order = SLAB_BREAK_GFP_ORDER_LO;/如果内存较大, 则取SLAB_BREAK_GFP_ORDER_HI( 见 kmem_cache_init()/ 该变量在 kmem_cache_create() 中使用 #defineSLAB_BREAK_GFP_ORDER_HI 2#defineSLAB_BREAK_GFP_ORDER_LO1
17、l 宏的说明#defineBYTES_PER_WORDsizeof(void *) / 用于对一般对象的对齐参数#defineslab_align_size(L1_CACHE_ALIGN(sizeof(kmem_slab_t) 在include/asm-i386/cache.h 中有如下定义: #if CPU=586 | CPU=686 #define L1_CACHE_BYTES 32 #else #define L1_CACHE_BYTES 16 #endif #define L1_CACHE_ALIGN(x) (x)+(L1_CACHE_BYTES-1)&(L1_CACHE_BYTES-
18、1)则slab_align_size的意义显而易见: 将kmem_slab_t 数据类型的大小与L1_CACHE_BYTES对齐./表示的对象管理方式的两个宏 (方式意义说明见后)#defineSLAB_CFLGS_OFF_SLAB 0x010000UL / off_slab 方式#defineSLAB_CFLGS_BUFCTL 0x020000UL / bufctlf 方式 /对象的用途#defineSLAB_CFLGS_GENERAL 0x080000UL/通用对象的标志#defineSLAB_HWCACHE_ALIGN 0x00002000UL /内核内存管理 /数据类型的对象/slab
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX源代码分析-内存管理 精品资料 LINUX 源代码 分析 内存 管理 精品 资料
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内