arm页目录偏移 是 21, 一个页目录项管理2M内存
#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
每一个页目录表存放 2048项
#define PTRS_PER_PGD 2048
#define __pfn_to_page(pfn) (mem_map + ((pfn) -ARCH_PFN_OFFSET))
//因为物理地址是从0x3000 0000开始算起的
x86 一个 管理 4M内存,偏移是 22, 一个页目录存放1024项, x86的二级页表 有一个 P位是不是在内存里面
为什么需要ZONE_DMA 区域
- 磁盘I/O所必需的, 如果部分区域, 物理内存分配完了, 就没有页面来进行盘区交换, 所以分成两部分,一部分做DMA,一部分做普通内存
- DMA不经过MMU进行映射, 这方面要求dma的物理地址不能太高
- DMA要求地址连续
每一个zone 有一组队列, 分别管理 0, 2, 4 ,8个 page,一直到1024个页面, 也就是4M
node->node_next 组成 一个单链表
node 下面有最多三个 zone
node->zone_t node_zones[MAX_NR_ZONES]表示管理的区(zone)
node_mem_map 指向具体的 page结构体数组
zone_struct里面 有一个 zone_pgdat 表示我在哪一个node上
在numa结构下, 分配策略怎么定, 肯定是先从本node->zone_DMA或者ZONE_NORMAL分配,那万一不够呢?怎么分配...这些策略由谁来指定, (node_zonelists 每一个这个指定一种分配策略)
zonelist_t node_zonelists[NR_GFPINDEX]
typedef struct zonelist_struct {
zone_t * zones [MAX_NR_ZONES+1]; // NULL delimited
int gfp_mask;
} zonelist_t;
vm_area_struct
vma->vm_start 包含在区间内的, vm_end不包含在区间内
用户空间被分成 很多个vma, 这些vma需要按照从小到大的顺序组合起来, 所以
由虚拟地址找到 vma是一个频繁的操作, 不能每次 vm_next来遍历,麻烦
handle_pte_fault---如果vma的vma->vm_ops存在的话