5、分区页框分配器
请求和释放页框
6、高端内存页框的内核映射
(1)永久内核映射kmap() →kmap_high()→map_new_virtual()
要想释放永久内核映射kunmap()释放由kmap()建立的永久内核映射,kunmap_2、high()释放高端内存中的映射。
(2)临时内核映射
7、伙伴系统算法
把所有的空闲页框分组成为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512,1024个连续的页框。
(1)数据结构
(2)分配块
__rmqueue()
(3)释放块
__free_page_bulk()
8、每CPU页框高速缓存
内存区为每个CPU提供了两个高速缓存:热高速缓存和冷高速缓存。
(1)通过每CPU页框高速缓存分配页框:bufferd_rmqueue()
(2)释放页框到每个CPU页框高速缓存:free_hot_page()、free_cold_page()——free_hot_cold_page()
9、管理区分配器
释放一组页框
二、内存区管理
1、slab分配器
2、高速缓存描述符
3、slab描述符
slab描述符可以存放在两个可能的地方:
外部slab描述符:存放在slab外部,位于cache_sizes指向的一个不适合ISA DMA的普通高速缓存中
内部slab描述符:存放在slab内部,或者非配给slab的第一个页框的起始位置。
4、普通和专用高速缓存
5、slab分配器与分区页框分配器的接口
6、给高速缓存分配slab
7、从高速缓存释放slab
8、对象描述符
外部对象描述符
内部对象描述符
9、对其内存中的对象
对于80x86处理器,BYRES_PER_WORD宏所产生的字节为4,即以4字节大小对齐。
10、slab着色
slab的长度=(num*osize)+ dsize + free
11、空闲Slab对象的本地高速缓存
12、分配slab对象
13、释放slab对象
14、通用对象
15、内存池
三、非连续内存区管理
1、非连续内存区的线性地址
2、非连续内存区的描述符
3、分配非连续内存区
vmalloc()函数给内核分配一个非连续内存区。