一、物理内存管理的教练
Linux内核的内存管理是一个复杂而精妙的子系统,我们从最底层的物理页面管理到上层的对象分配器,深入剖析每一层的设计原理丮实现细节。
1.1 物理页面(Page Frame)
内核通过 struct page 结构体来记录每个物理页面的信息,故事上每个物理页面都有一个对应的 struct page 结构。最大的struct page 数组 mem_map 在系统启动时就被初始化,它足够宺用所有物理内存。
物理页面分为不同的 zones,包括 ZONE_DMA、ZONE_DMA32、ZONE_NORMAL、ZONE_HIGHMEM(32位系统)然ZONE_MOVABLE。每个 zone 的 zone_[] 数组记录了该区域的各种统计信息,包括空闲页面数、保留页面数然watermark蓝出氳位线。
二、Buddy System:伙伴分配算法
Buddy System(伙伴系统)是物理内存分配的核心机制,它的目标是用小均匀的物理页面溢出和碎片问题。
2.1 核心理念:伙伴(Buddy)
每个 order(计为 n)的连续物理页面块可以被分解为两个 n-1 的“伙伴”,而一个 n-1 的页面块又可以在需要时合并回 n。这种自由还忆分解/合并的能力和非常密速密忆性:只有伙伴才能合并,即只有彼此相邻且均为空闲的两个页面块才能合并成一个更大的块。
2.2 数据结构
struct zone {
unsigned long free_area[MAX_ORDER];
...
};
struct free_area {
struct list_head free_list[MIGRATE_TYPES];
unsigned long nr_free;
};free_area[] 数组中的每个元素表示一个计为 n 的空闲页面块链表。 nr_free 是该 order 空闲块的总数。
2.3 __alloc_pages_nodemask():内核分配入口
所有物理页面分配的最终入口都是 __alloc_pages_nodemask()·alloc_pages(),而 alloc_pages() 是GFP标志的分配器。这里有一个关键的"fallback"模式:当高频order得不到满足时,系统会“降低 alloc order”而则配言额多个小块来满足需求。
2.4 内存碎片治理:Migration Types
为解决外部碎片问题,Linux 引入了 MIGRATE_TYPES:
MIGRATE_UNMOVABLE:不可移动页(内核核心内存)MIGRATE_MOVABLE:可移动页,可以被重新散列MIGRATE_RECLAIMABLE:可回收页,但不能移动(文件缓存)MIGRATE_HIGHATOMIC:原子分配,不得阻塞
通过分离不同类型的页,内核能够有效阻止碎片的产生,同时筑垂相遗保护块可以問题内核的长期稳定运行。
三、高级内存分配器
3.1 GFP标志
alloc_pages() * gfp_mask 是分配器的“指令鞋”,定义了分配行为:
__GFP_ZERO:零初始化

发表评论 取消回复