Linux内核内存布局与映射实战
📚 共计 30 章节
01
内存寻址的演变
从实模式到保护模式,分段机制与分页机制的引入背景。
分段
分页
保护模式
02
内核虚拟地址空间布局
用户空间与内核空间的分界线 (3:1/2:2),x86_64与ARM64布局差异。
地址空间
x86_64
ARM64
03
直接内存映射区
ZONE_NORMAL/DMA,线性映射原理,物理内存与虚拟地址固定偏移。
线性映射
ZONE_NORMAL
04
vmalloc区
动态映射非连续内存,vmalloc与kmalloc区别,ioremap实现。
vmalloc
ioremap
05
低端内存与高端内存
高端内存引入原因,kmap/kmap_atomic/fixmap。
高端内存
kmap
06
内核页表初始化
startup_32/64 → paging_init,页表层级 PGD/P4D/PUD/PMD/PTE。
页表
paging_init
07
TLB与缓存一致性
TLB刷新时机与策略,flush_tlb_all/local,页表缓存管理。
TLB
缓存一致性
08
内存描述符 mm_struct
进程地址空间管理,mmap与VMA组织 (红黑树+链表)。
mm_struct
VMA
09
VMA操作实战
find_vma, vma_merge, insert_vm_struct, split_vma。
VMA操作
红黑树
10
缺页异常处理
do_page_fault流程,匿名页/文件页差异,写时复制COW。
缺页异常
COW
11
malloc底层实现
glibc ptmalloc与brk/sbrk,mmap分配大块内存阈值。
malloc
brk
12
伙伴系统 Buddy System
页分配器核心算法,order与迁移类型,反碎片技术。
伙伴系统
碎片
13
slab分配器
对象缓存原理,slab/slub/slob对比,kmem_cache_create。
slab
slub
14
页回收机制 PFRA
LRU链表 (活跃/非活跃),kswapd工作流程,回收阈值。
PFRA
kswapd
15
页面置换算法
LRU近似实现 (双链表),第二次机会法,refault距离。
LRU
置换
16
内存压缩 zram/zswap
压缩交换原理,zram块设备,zswap写回策略。
zram
zswap
17
KSM 内核同页合并
合并相同匿名页,ksmd守护进程,去重与COW权衡。
KSM
去重
18
cgroup内存控制器
memory.limit_in_bytes,oom_score/oom_adj,OOM killer。
cgroup
OOM
19
内存热插拔
物理内存热添加/移除,memory_block,notifier回调。
热插拔
memory_block
20
NUMA架构内存管理
节点/区域/页三级结构,内存分配策略 MPOL_*。
NUMA
MPOL
21
CMA 连续内存分配器
预留连续内存,dma_alloc_coherent / cma_alloc。
CMA
DMA
22
内存映射文件 mmap
文件页缺页处理,预读readahead,共享/私有映射。
mmap
预读
23
大页内存 HugeTLB
2MB/1GB大页配置,透明大页THP合并/分裂,优缺点。
HugeTLB
THP
24
内存屏障与原子操作
读写屏障 rmb/wmb/mb,DMA一致性/流式映射,cacheline乒乓。
内存屏障
DMA
25
内存错误处理
MCE流程,软/硬错误,内存故障隔离 Poisoning。
MCE
故障隔离
26
KASLR与内核防护
内核地址随机化,KPTI防御Meltdown,SMAP/SMEP。
KASLR
KPTI
27
内存性能调优
numactl/taskset,perf mem,slabtop/vmstat监控。
性能
perf
28
eBPF内存追踪
kprobe/tracepoint监控分配,bcc工具 memleak/oomkill。
eBPF
bcc
29
容器内存隔离
cgroup/namespace内存视图,docker run -m,swapiness调整。
容器
swapiness
30
实战案例:泄漏/碎片/OOM
kmemleak排查,compact_memory碎片整理,OOM定位优化。
kmemleak
OOM