2026W25技术:book-深入理解Linux虚拟内存管理-框架1.0
缘起
- 这本书其实之前(读过一下),但只是抄书,现在又不知道是啥了,最近在看另一本书(内存和进程时),正好有个电子书在电脑上,就稍微串了下体系
- 全书13章,我大概分为3部分,其实内容部分倒占比不多,占比多的是附录,目前代码都到7.x版本了,
- 用时34min,20260626,23:19-23:53,
内容
2.1、硬件抽象层(2-4章)
- chap02上来就是NUMA(这是cpu的架构),
lscpu可以看出其有几个numa节点(nodes), - chap04进程地址空间,从进程的角度看(是有个固定的结构的),
mm_struct,总结(自己串起来的逻辑是啥)
- 1、进程通过 mm_struct 管理其整个虚拟地址空间,系统调用 (mmap、 brk),字段中有VMA的数量,
- 2、空间由若干个 VMA 组成,每个 VMA 描述一段连续的虚拟地址区域(vm_area_struct, 红黑树, 链表)
- 3、CPU 访问虚拟地址时,MMU 通过 页表 来查找对应的物理地址(这里有3层逻辑结构,PGD,PMD,PTE,
- 4、如果页表查找失败(比如没有映射),就会触发缺页异常。这是TLB机制,
- 5、内核响应异常时,会通过伙伴系统从合适的内存区域 (Zone) 中分配一个物理页框。主要应用是alloc_pages,
- 6、分配成功后,会更新 页表 (PTE),并建立虚拟地址与物理页框的映射
- 7、内核通过 struct page 来管理所有物理页框。
2.2、资源分配层(5-8章)
- 内存初始化
- 物理页分配(连续与非连续内存),chap06物理页面分析,chap07非连续内存
- slab分配器,chap08slab分配器
总结(最终的几个调用场景,都会到)
- 1、缺页异常(匿名页),
do_anonymous_page()→ alloc_zeroed_user_highpage()→ alloc_pages() - 2、缺页异常(文件映射),
do_fault()→ do_fault()→ alloc_page() - 3、内核模块 kmalloc,
kmalloc()→ SLAB/SLUB → 如果 SLAB 层没有空闲对象,调用 alloc_pages() - 4、用户态 mmap,
mmap()→ do_mmap() → 首次访问时触发缺页 → 同上 - 5、驱动申请 DMA 内存,
dma_alloc_coherent() → alloc_pages() - SLAB 是伙伴系统的上层封装
2.3、异常处理层(9-13章)
- 这部分没细看,只是建立一个框架
- 内存紧张,先回收,Chap10页框回收(先回收不用的页)
- LRU 链表、kswapd、内核线程、页面老化机制
- 内存紧张到,回收的空间也不够用
- 回收+交换,还不够用,Chap13内存溢出管理(OOM Killer进程)
- 32 位系统访问大内存【硬件限制】,Chap09高端内存映射
- 32 位系统下,内核无法直接访问所有物理内存(>896MB)。如何访问高地址的物理内存?
- 通过临时映射(kmap、kmap_atomic)将高端内存页框映射到内核虚拟地址空间。
- 进程间共享数据,Chap12共享内存(VFS / tmpfs)
- mmap基于 VFS 的实现,以及tmpfs、shmem等共享内存机制。
最后
- 初步整理,只是为了弄个框架,不然的话,直接看知识点有点脑壳疼,也没办法记住一些知识点,