博客
关于我
【原创】(十二)Linux内存管理之vmap与vmalloc
阅读量:404 次
发布时间:2019-03-06

本文共 2192 字,大约阅读时间需要 7 分钟。

vmap和vmalloc机制分析

系统背景

内核中的vmap和vmalloc机制是用于处理物理内存到虚拟地址的映射关系,特别是在物理内存不连续的情况下,如何将其高效地映射到虚拟地址空间中。这些机制在内核编程和内存管理中具有重要作用。

核心数据结构

vmap和vmalloc的核心数据结构包括vm_struct和vmap_area两个结构体。

vm_struct结构体

struct vm_struct {    struct vm_struct *next;    /* 节点指针 */    void            *addr;    /* 虚拟地址 */    unsigned long    size;    /* 映射的物理页数 */    unsigned long    flags;    /* 标志位 */    struct page       **pages;   /* 对应的物理页面 */    unsigned int     nr_pages; /* 页面数量 */    phys_addr_t      phys_addr; /* 物理地址 */    const void       *caller;   /* 调用者信息 */};

vmap_area结构体

struct vmap_area {    unsigned long va_start;   /* 虚拟地址起始 */    unsigned long va_end;    /* 虚拟地址结束 */    unsigned long flags;     /* 标志位 */    struct rb_node rb_node;  /* 红黑树节点 */    struct list_head list;    /* 链表节点 */    struct llist_node purge_list; /* 垂直清除列表 */    struct vm_struct *vm;     /* 对应的vm_struct指针 */    struct rcu_head rcu_head; /* 并发控制头 */};

vmap_area用于描述一段虚拟地址区域,通过va_start和va_end确定范围。结构体中的rb_node用于挂在红黑树上,list用于挂在链表中,vm字段则指向对应的vm_struct结构,用于管理虚拟地址和物理页之间的映射关系。

红黑树机制

红黑树是一种高效的查找数据结构,广泛应用于内核中。其核心特点是通过节点颜色(红色或黑色)来维护二叉搜索树的性质,确保搜索效率。

红黑树的四个主要规则:

  • 每个节点必须是红色或黑色。
  • 根节点必须是黑色。
  • 红色节点的子节点必须是黑色。
  • 从根节点到任意叶子节点的路径上的黑色节点数量必须相同。
  • 红黑树的定义如下:

    struct rb_node {    unsigned long __rb_parent_color; /* 父节点颜色 */    struct rb_node *rb_right;     /* 右孩子 */    struct rb_node *rb_left;      /* 左孩子 */} __attribute__((aligned(sizeof(long))));

    vmap和vunmap功能分析

    vmap函数

    vmap的主要功能是将物理内存映射到虚拟地址空间中,具体流程如下:

  • 调用alloc_vmap_area函数,通过红黑树查找第一个区域(first vm_area)。
  • 根据first vm_area,查找满足大小要求的vmap_area区域。
  • 将物理内存页框映射到虚拟地址区域,并返回虚拟起始地址。
  • 在alloc_vmap_area函数中,使用了全局变量缓存机制,用于提高分配效率。

    vunmap函数

    vunmap的功能与vmap相反,主要流程包括:

  • 查找对应的vmap_area区域。
  • 取消物理页表映射。
  • 从红黑树和链表中删除vmap_area区域。
  • 将物理内存页返回系统。
  • 由于映射关系的修改可能导致TLB flush,vunmap采用懒处理(lazy tlb),延迟刷新TLB,以提高性能。

    vmalloc和vfree分析

    vmalloc函数

    vmalloc用于分配一个大块的连续虚拟地址空间。与vmap相似,主要流程包括:

  • 在VMALLOC_START到VMALLOC_END区域内查找空闲区域。
  • 将物理内存页框映射到虚拟地址空间。
  • 返回虚拟起始地址。
  • 与kmalloc相比,vmalloc通过alloc_page接口申请order=0的页面,并映射到连续的虚拟空间,适用于物理内存不连续的情况。

    vfree函数

    vfree用于释放已分配的虚拟地址空间,其逻辑与vunmap类似,主要步骤包括:

  • 检查是否在中断上下文中,若是则推迟释放。
  • 调用__vunmap函数,取消物理页表映射,并删除vmap_area区域。
  • 总结

    vmap和vmalloc机制通过红黑树和缓存机制,高效地管理物理内存到虚拟地址的映射关系。在内核内存管理中,这些机制确保了物理内存的高效利用和虚拟地址的正确映射,特别是在物理内存不连续的情况下。理解这些机制对于深入掌握内核内存管理具有重要意义。

    转载地址:http://otzkz.baihongyu.com/

    你可能感兴趣的文章
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>