|
提要:本系列文章主要参考MIT 6.828课程以及两本书籍《深入理解Linux内核》 《深入Linux内核架构》对Linux内核内容进行总结。
内存管理的实现覆盖了多个领域:
- 内存中的物理内存页的管理
- 分配大块内存的伙伴系统
- 分配较小内存的slab、slub、slob分配器
- 分配非连续内存块的vmalloc分配器
- 进程的地址空间
内存管理实际分配的是物理内存页,因此,了解物理内存分布是十分必要的。
物理内存布局
在初始化阶段,内核必须建立一个物理地址映射来指定哪些物理地址范围对内核可用而哪些不可用(或者因为它们映射硬件设备I/O的共享内存,或者因为相应的页框含有BIOS数据)。
内核将下列页框记为保留:
- 在不可用的物理地址范围内的页框
- 含有内核代码和已初始化的数据结构的页框。
保留页框中的页决不能被动态分配或交换到磁盘上。
例如,MIT 6.828 Lab2 -> Part 1: Physical Page Management -> page_init() 方法的实现中,注释如下:- // The example code here marks all physical pages as free.
- // However this is not truly the case. What memory is free?
- // 1) Mark physical page 0 as in use.
- // This way we preserve the real-mode IDT and BIOS structures
- // in case we ever need them. (Currently we don't, but...)
- // 2) The rest of base memory, [PGSIZE, npages_basemem * PGSIZE)
- // is free.
- // 3) Then comes the IO hole [IOPHYSMEM, EXTPHYSMEM), which must
- // never be allocated.
- // 4) Then extended memory [EXTPHYSMEM, ...).
- // Some of it is in use, some is free. Where is the kernel
- // in physical memory? Which pages are already in use for
- // page tables and other data structures?
复制代码 MIT 6.828中,主机的物理内存布局如下:
[code]+------------------+ |
|