Physical

内存分配造成的碎片化如何解决?
p.free 当持有两个连续的节点时会合并他们。
zone 持有一片连续物理空间,形成一组队列, 数组大小为 10,Pages 为一块物理空间,块大小为 1,2,4,8,···,256,512,1024 个 page (4k 大小)。
最多三个 zone 每个 node,分别是 DMA,NORMAL,HIGHMEM。
zonelists 记录了分配策略,如分配页面时先试试 zonelist_t 中第一个 zone 能否分配足够空间, 如果不够就从试试第二个。
node_zones 最长为 #define MAX_NR_ZONES 3, zonelist_t 为 MAX_NR_ZONES+1,node_zonelists 长度为#define NR_GFPINDEX 0x100.
Virtual
vma 数量太多时会建立 AVL 树加快查找速度。 vma 即一片虚拟内存空间,由字段 vm_start, vm_end 确定(左闭右开)。虚拟内存由于是针对进程而言的, 所以 find_vma函数会要求两个参数。一个是进程 task 结构中的 mm_struct (进程控制块),一个是虚拟地址。内核调度时会将当前进程的 pgd 写入 CR3 用作虚拟地址到物理地址的映射。
mm_struct 里还有一个叫做 mmap_cache 存着上一次找到虚拟内存空间的地址, find_vma 的时候会先检查它,如果命中直接返回。(注释中标明有 35% 的命中率)
注意:vma 只是代表进程需要这些空间, 并不代表已经建立好了映射或存在于内存之中(可能 swap 到磁盘上了)
