slab描述符struct slab用来描述每个slab:
struct slab{
struct list_head list; /*满,部分满或空闲链表*/
unsigned long colouroff; /*slab着色的偏移量*/
void *s_mem; /*在slab中的第一个对象*/
unsigned int inuse; /*已分配的对象数*/
kmem_bufctl_t free; /*第一个空闲对象(如果有)*/
}
slab描述符要么在slab之外另行分配,要么就放在slab自身最开始的的地方。slab层只有当给定的高速缓存中既没有部分满的也没有空的slab时才会调用页的分配函数,slab层的管理是在每个高速缓存的基础之上的,通过提供给整个内核一个简单的接口来完成。当创建一个高速缓存后,slab层所起的作用就像一个专门的分配器,可以为具体的对象类型进行分配。
slab分配器的接口
kmem_cache_t *kmem_cache_create(const char *name,size_t size
size_t align, unsigned long flags,
void (*ctor)(void *,kmem_cache_t *,unsigned long),
void (*dtor)(void *,kmem_cache_t *,unsigned long))
参数依次是:高速缓存的名字,每个元素的大小,缓存中第一个对象的偏移,控制高速缓存行为的标志,构造和析构函数(内核不用)。
int kmem_cache_destory(kmem_cache_t *cachep) 销毁给定的高速缓存
void *kmem_cache_alloc(kmem_cache_t *cachep, int flags) 获取对象指针
void kmem_cache_free(kmem_cache_t *cachep,void *objp) 释放一个对象
当要创建和销毁很多较大的数据结构时应考虑建立slab高速缓存。slab层会给每个处理器维持一个对象高速缓存(空闲表),这种高速缓存会极大的提高对象分配和回收的性能。slab层不是频繁地分配和释放内存,而是事先分配好对象存放在高速缓存中。当你需要一块新的内存来存放数据结构时,slab层一般无需另外分配内存,而只需要从高速缓存中得到一个对象就可以了。
栈上的静态分配
用户空间的栈非常大,可以动态增长,而内核栈大小固定。通常内核栈是1页或2页。栈上大量的静态分配是很危险的。
高端内存的映射
x86体系结构上,高于896MB的所有物理内存的范围大都是高端内存,不会永久地或自动的映射到内核地址空间。高端内存中的页被映射到3GB到4GB之间。
永久映射:要映射一个给定的page结构到内核地址空间,使用:void *kmap(struct page *page) 只能用在进程上下文中。
解除映射:使用 void *kunmap(struct page *page)
临时映射:可以用在不能睡眠的地方,禁止内核抢占。可用于中断处理程序,获取映射时不阻塞。
void *kmap_atomic(struct page *page,enum km_type type)
struct slab{
struct list_head list; /*满,部分满或空闲链表*/
unsigned long colouroff; /*slab着色的偏移量*/
void *s_mem; /*在slab中的第一个对象*/
unsigned int inuse; /*已分配的对象数*/
kmem_bufctl_t free; /*第一个空闲对象(如果有)*/
}
slab描述符要么在slab之外另行分配,要么就放在slab自身最开始的的地方。slab层只有当给定的高速缓存中既没有部分满的也没有空的slab时才会调用页的分配函数,slab层的管理是在每个高速缓存的基础之上的,通过提供给整个内核一个简单的接口来完成。当创建一个高速缓存后,slab层所起的作用就像一个专门的分配器,可以为具体的对象类型进行分配。
slab分配器的接口
kmem_cache_t *kmem_cache_create(const char *name,size_t size
size_t align, unsigned long flags,
void (*ctor)(void *,kmem_cache_t *,unsigned long),
void (*dtor)(void *,kmem_cache_t *,unsigned long))
参数依次是:高速缓存的名字,每个元素的大小,缓存中第一个对象的偏移,控制高速缓存行为的标志,构造和析构函数(内核不用)。
int kmem_cache_destory(kmem_cache_t *cachep) 销毁给定的高速缓存
void *kmem_cache_alloc(kmem_cache_t *cachep, int flags) 获取对象指针
void kmem_cache_free(kmem_cache_t *cachep,void *objp) 释放一个对象
当要创建和销毁很多较大的数据结构时应考虑建立slab高速缓存。slab层会给每个处理器维持一个对象高速缓存(空闲表),这种高速缓存会极大的提高对象分配和回收的性能。slab层不是频繁地分配和释放内存,而是事先分配好对象存放在高速缓存中。当你需要一块新的内存来存放数据结构时,slab层一般无需另外分配内存,而只需要从高速缓存中得到一个对象就可以了。
栈上的静态分配
用户空间的栈非常大,可以动态增长,而内核栈大小固定。通常内核栈是1页或2页。栈上大量的静态分配是很危险的。
高端内存的映射
x86体系结构上,高于896MB的所有物理内存的范围大都是高端内存,不会永久地或自动的映射到内核地址空间。高端内存中的页被映射到3GB到4GB之间。
永久映射:要映射一个给定的page结构到内核地址空间,使用:void *kmap(struct page *page) 只能用在进程上下文中。
解除映射:使用 void *kunmap(struct page *page)
临时映射:可以用在不能睡眠的地方,禁止内核抢占。可用于中断处理程序,获取映射时不阻塞。
void *kmap_atomic(struct page *page,enum km_type type)