内存管理学习笔记(二)

本文详细介绍了slab分配器的工作原理及其核心数据结构——slab描述符。解释了如何通过slab分配器创建和销毁缓存,以及如何分配和释放对象。此外,还讨论了高端内存映射的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值