深入理解Linux内核-第八章内存管理

页框管理:

页描述符:描述页框的状态,所有的页描述符存储在mem_map数组中。每个描述符长度为32字节

内存区管理:(X86结构为例)

zone_DMA:包含低于16MB的内存页框

zone_NORAML:包含16MB--896MB的内存页框

zone_HIGHMEM:高于896MB的内存页框。

zone_DMA和zone_NORAML包含的常规内存,通过线性地址直接映射到线性地址空间的第四个GB。

 

保留的页框池:内核为原子内存分配请求保留一个页框池,只有在内存不足时才使用。保留内存的数量存放在min_free_kbytes变量中。ZONE_DMA和ZONE_NORMAL都保留一定数量的页框给保留内存。

 

分区页框分配器:处理对连续页框组的内存分配请求。当请求分配时,搜索一个满足要求的管理区,在管理区内使用伙伴系统分配页框。为了达到更好的性能,小部分页框被保留在高速缓存中,用于快速的对但也页框的分配请求。

每CPU页框高速缓存:使用提前分配好的页框。页框的信息保存在内存描述符内。

高端内存页框的内核映射:内核不能直接访问高端内存的页框,没有相应的线性地址。内核线性地址空间的最后128MB用于高端内存的映射,这种映射是暂时的,通过重复使用,使得内核在不同时间能够访问整个高端内存。高端内存映射机制

永久内核映射:建立永久内核映射可能阻塞当前进程,这发生在空闲页表项不存在时,也就是在高端内存上没有页表项可以用作页框的窗口。因此不能用在中断处理程序和延迟函数中。不使用的映射需要kunmap()。

临时内核映射:每个CPU都有它自己的抱哈13个窗口的集合,一个窗口表示一个页表项,映射一个页框。内核必须确保同一窗口不会被两个不同的控制路径使用。

  1. 内核在 FIXADDR_START 到 FIXADDR_TOP 之间保留了一些线性空间用于特殊需求。这个空间称为”固定映射空间”。在这个空间中有一部分用于高端内存的临时映射
  2. 这块空间具有如下特点:

(1)每个 CPU 占用一块空间

(2)在每个 CPU 占用的那块空间中,又分为多个小空间,每个小空间大小是 1 个 page,每个小空间用于一个目的,这些目的定义在 kmap_types.h 中的 km_type 中。

伙伴系统算法:解决外碎片问题,即提供连续的页框。每个管理区都有不同的伙伴算法。

管理区分配器:管理区分配器:1)应当保护保留的页框池(用于原子内存分配);2)内存不足且允许阻塞当前进程时,应当触发页框回收算法,回收后再次尝试分配;3)尽量不分配DMA区的页框。

内存区管理:(内存区:具有连续的物理地址,任意长度的内存)

内碎片产生的主要原因:请求的内存大小和分配的内存大小不匹配。

slab分配器主要是针对那些内核中小但是多而频繁的内存需求的申请和释放的特征入手,做的局部物理页的优化策略,提高效率降低时间,还是时间和空间。

普通高速缓存:

第一个高速缓存kmem_cache,包含由内核使用的其余高速缓存的高速缓存描述符。也就是存放高速缓存描述符对象的高速缓存。

普通用途的高速缓存,系统初始化期间调用,每种大小包含两个高速缓存,分别存放在DMA和常规内存中。

专用高速缓存:

深入理解Linux内核-第八章内存管理

 

 

 

非连续内存分配:

深入理解Linux内核-第八章内存管理