美文网首页
linux内存管理详解

linux内存管理详解

作者: sgy1993 | 来源:发表于2018-03-25 11:12 被阅读0次
    三层地址映射图

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

    相关文章

      网友评论

          本文标题:linux内存管理详解

          本文链接:https://www.haomeiwen.com/subject/mhdqcftx.html