linux内存管理详解

linux内存管理详解_第1张图片
三层地址映射图

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 区域

  1. 磁盘I/O所必需的, 如果部分区域, 物理内存分配完了, 就没有页面来进行盘区交换, 所以分成两部分,一部分做DMA,一部分做普通内存
  2. DMA不经过MMU进行映射, 这方面要求dma的物理地址不能太高
  3. DMA要求地址连续

每一个zone 有一组队列, 分别管理 0, 2, 4 ,8个 page,一直到1024个页面, 也就是4M


image.png
linux内存管理详解_第2张图片
image.png

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;
linux内存管理详解_第3张图片
image.png

vm_area_struct
vma->vm_start 包含在区间内的, vm_end不包含在区间内


image.png

用户空间被分成 很多个vma, 这些vma需要按照从小到大的顺序组合起来, 所以

由虚拟地址找到 vma是一个频繁的操作, 不能每次 vm_next来遍历,麻烦


image.png

handle_pte_fault---如果vma的vma->vm_ops存在的话

你可能感兴趣的:(linux内存管理详解)