源码基于:Linux6.12
约定:
- 芯片架构:ARM64
- 内存架构:UMA
- CONFIG_ARM64_VA_BITS :39
- CONFIG_PAGE_SHIFT :12
- CONFIG_PGTABLE_LEVELS :3
0. 前言
我们了解了内存规整的4种方式:
- 手动规整;
- kcompactd 内核线程规整;
- 主动规整
- 直接内存规整;

四种方式的核心处理函数都是 compact_zone():
- 直接内存规整在 try_to_compact_pages() 轮询zone 是申请时指定的 highest_zoneidx,order 是从申请的时候传入;
- kcompactd_do_work() 中会轮询的 highest_zoneidx 和 max_order 都是在wakeup_kcompactd() 时传入;
- 主动规整、手动规整都是调用 compact_node(),轮询所有的zone,order 为 -1;
本文将完全剖析规整的核心处理函数 compact_zone()。