linux内存管理详解

三层地址映射图

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
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;
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存在的话

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 操作系统对内存的管理 没有内存抽象的年代 在早些的操作系统中,并没有引入内存抽象的概念。程序直接访问和操作的都是物...
    Mr槑阅读 16,780评论 3 24
  • 页描述符 我们都知道Linux的内存是分页的,在Linux 中每页的大小是4KB(大部分情况下),Linux需要记...
    飞鱼light阅读 1,982评论 0 4
  • Linux 内存管理 1 页的概念 linux 内核中把物理页作为内存分配的最小单位,32位CPU 页的大小通常为...
    赤兔欢阅读 3,308评论 0 5
  • 安静的午后,在一阵风吹来的秋天里,守一城恬淡的光阴,就着不老的时光,慢慢饮下日子里的纯粹,有时候生活就是如此简单,...
    L念暖阅读 635评论 9 8
  • 结庐在人境,而无车马喧。 问君何能尔?心远地自偏。 采菊东篱下,悠然见南山。 山气日夕佳,飞鸟相与还。 此中有真意...
    耀举阅读 805评论 0 2