内存slab分配器最初思想来自Solaris的内核态小数据结构(一页以内)的内存分配,受到Solaris的影响,Linux内核也采用类似思想来减少页内碎片,其基本思想是:一次向内核获取整数页,slab根据数据结构的大小进行划分为一个个小的数据结构,当需要时直接从该链表上摘取一个返回应用程序,当应用程序释放时,而非真正释放,只需要该空间放回到链表中,当分散的一页多块又聚集一页时,又会拼成一页,同时判断slab空闲的页数,如果空闲页超过一定的页数,就会向系统释放一定的页数。一个slab分配器只能管理一个指定大小的数据结构分配。
二、函数功能
1.static void yaffs_deinit_raw_tnodes(struct yaffs_dev *dev)//将挂在dev设备上的tnodes 释放掉
2.static void yaffs_init_raw_tnodes(struct yaffs_dev *dev)//将挂在dev设备上的tnodes初始化
3.static int yaffs_create_tnodes(struct yaffs_dev *dev, int n_tnodes)//创建n_todes个节点数
new_tnodes = kmalloc(n_tnodes * dev->tnode_size, GFP_NOFS);
创建好以后,再将之链接起来放在tnl = kmalloc(sizeof(struct yaffs_tnode_list), GFP_NOFS);
4.struct yaffs_tnode *yaffs_alloc_raw_tnode(struct yaffs_dev *dev)//进行分配
5.void yaffs_free_raw_tnode(struct yaffs_dev *dev, struct yaffs_tnode *tn)//释放一个tnode放到freelist中
6.static void yaffs_init_raw_objs(struct yaffs_dev *dev)//为obj进行初始化
7.static void yaffs_deinit_raw_objs(struct yaffs_dev *dev)//释放obj
8.static int yaffs_create_free_objs(struct yaffs_dev *dev, int n_obj)//创建n_obj个objs
new_objs = kmalloc(n_obj * sizeof(struct yaffs_obj), GFP_NOFS);同样需要将之链接在一个the free list
9.struct yaffs_obj *yaffs_alloc_raw_obj(struct yaffs_dev *dev)//分配obj
10.void yaffs_free_raw_obj(struct yaffs_dev *dev, struct yaffs_obj *obj)//将obj放入对应的free list
11.void yaffs_deinit_raw_tnodes_and_objs(struct yaffs_dev *dev)
yaffs_deinit_raw_tnodes(dev);
yaffs_deinit_raw_objs(dev);
12.void yaffs_init_raw_tnodes_and_objs(struct yaffs_dev *dev)
allocator = kmalloc(sizeof(struct yaffs_allocator), GFP_NOFS);
if (allocator) {
dev->allocator = allocator;
yaffs_init_raw_tnodes(dev);
yaffs_init_raw_objs(dev);
}