一、物理内存管理的教练

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:零初始化
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
网站二维码

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部