微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式系统e_slab的研究与实现

嵌入式系统e_slab的研究与实现

时间:11-25 来源:3721RD 点击:

2 e_slab分配器设计

2.1 基本管理结构


e_slab分配器有3个重要的基本结构,下面分别对其作相关介绍。

(1)object_t结构
typedef struct object {
unsigned long size;
unsigned long offset;
} object_t;

object_t是描述对象的基本结构,每个对象对应一个object_t结构,它描述了对象的大小和下一个空闲对象的地址。

(2)e_slab_t结构
typedef struct e_slab _s {
struct list_head list;
void *s_mem;
unsigned int units;
unsigned int free;
} e_slab _t;

e_slab _t是管理对象的基本结构,它不仅描述了本结构的页块起始地址,而且存储了空闲对象的数量和地址等信息。

object_t、e_slab _t和对象结构如图3虚框②内所示。

(3)cache结构
typedef struct cache_s {
struct list_head next;
struct list_head slab_list;
unsigned int objsize;
unsigned int gfporder;
unsigned int num;

} cache_t;

cache的描述结构为cache_t,它主要描述了所管e_slab的基本信息。由于cache_t结构大小相同,可把cache_t看做一个专用对象,所有的cache组织在一起。

cache管理的所有e_slab被加入到list队列。把管理所有cache的结构称之为cache_cache。cache_cache与cache之间有两种关系:一种是双向队列关系,如图3虚框①内所示,cache_cache利用双向链表将系统中所有的cache(包括专用cache和通用cache)组成循环队列;一种是cache与对象之间的关系。

2.2 e_slab分配器初始化

e_slab分配器初始化主要完成cache、e_slab_t等结构的创建,为对象的分配做好准备。

2.2.1 cache的创建

cache_cache是系统中所有cache的管理者,它的创建优先于所有的cache。系统会为每种对象创建一个cache,创建流程如下:

(1)申请一个cache空间。从cache_cache中分配一个专用对象,即cache。设置cache中的各个域,包括管理的对象大小的上限和e_slab大小,其中e_slab大小与对象大小有关。

(2)将此cache加入管理队列。将cache加入cache_cache组成的双向队列中,双向队列采用通用链表链接所有的cache。

(3)将cache加入分配队列。用一个全局的cache指针指向生成的cache。

2.2.2 e_slab的创建

在cache的创建过程中,需为每个cache创建一个e_slab。e_slab中的对象全部空闲,可供分配,其流程如下:

(1)借助页面分配器申请连续物理页面。根据e_slab申请的大小和是否有DMA请求,在相应的内存区申请连续页块。

(2)设置页面属性。主要设置该页面的e_slab标志,并将该页块与cache和e_slab关联。

(3)设置e_slab描述结构,初始化对象结构。

2.3 对象的分配与释放

对象的分配与释放是内存管理模块提供的两个基本接口。

2.3.1 对象的分配

当系统需要小内存块或者专用对象时,系统会调用对象分配操作,完成对对象的分配,具体流程如图4所示。


(1)找到对应的cache。根据申请对象的大小定位相应的cache。

(2)确定对应的e_slab。检查cache中的e_slab,找到满足本次请求的e_slab,如果所有的e_slab均不能满足,则创建一个新的e_slab并添加到cache管理的队列中。

(3)从e_slab中分配一个空闲对象。从e_slab为系统分配一个空闲对象和object_t结构,将对象返还给系统,调整e_slab中对象,管理数组结构。

2.3.2 对象的释放

系统使用完对象后,应及时释放对象,否则内存会越用越少。对象释放流程如图5所示。


(1)确定对象对应的cache与e_slab。根据对象的地址可以获得所在页面的描述符结构,从而获得对应的cache和e_slab。

(2)释放对象。获得对象在e_slab中的偏移,采用头插法将对象加入空闲对象队列,并使e_slab中空闲内存增加释放值。

(3)e_slab的调整。检查e_slab中空闲内存大小,若等于e_slab中所有对象都释放,则清除页面的e_slab标志,并把e_slab占用页块归还给物理内存管理器。

2.4 e_slab分配器的回收

在系统退出、内存回收等不再需要e_slab分配器时,需进行e_slab分配器的回收,主要完成e_slab的释放和cache的释放。

2.4.1 e_slab的释放

在对象释放过程中,若发现某个e_slab已经全部空闲,没有分配的对象,则将其释放,流程如下:

(1)将e_slab从cache结构中删除。e_slab从cache的list队列中摘掉。

(2)清除页面标志。将e_slab所在物理页面的e_slab标志清除,并清除页面与e_slab和cache的关联,使页面回到初始状态。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top