内存管理

物理内存管理

内存区域

非均匀内存访问

页面分配

/* 分配 2^order 个连续页面,并返回指针,指针指向第一个页面的描述符 */
struct page *alloc_pages(gfp_mask, order);

/* 分配单个页面 */
struct page *alloc_page(gfp_mask);


/* 返回内核虚拟地址的辅助函数 */
void *__get_free_pages(gfp_mask, order);
void *__get_free_page(gfp_mask);
void *__get_zero_page(gfp_mask);
void *__get_dma_pages(gfp_mask, order);

为什么只以 2 的幂次分配页面?

伙伴算法

分配大小为 N 的块

释放大小为 N 的块

Linux 的实现

小型分配

SLAB 分配器

为什么使用 SLAB?

SLAB 架构

../_images/slab-overview.png

缓存描述符

SLAB 描述符

SLAB 详细结构

../_images/slab-detailed-arch.png

通用缓存与特定缓存

对象描述符

../_images/slab-object-descriptors.png

对象描述符

SLAB 着色

../_images/slab-coloring.png

虚拟内存管理

地址空间描述符

 

../_images/ditaa-0eda95a3f39dfac448fd07589656b123d3548328.png

地址空间描述符

分配虚拟内存

释放虚拟内存

Linux 虚拟内存管理

Linux 虚拟内存管理

../_images/page-fault-handling.png