博客
关于我
【原创】(十二)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/

    你可能感兴趣的文章
    Network Sniffer and Connection Analyzer
    查看>>
    Network 灰鸽宝典【目录】
    查看>>
    NetworkX系列教程(11)-graph和其他数据格式转换
    查看>>
    Networkx读取军械调查-ITN综合传输网络?/读取GML文件
    查看>>
    network小学习
    查看>>
    Netwox网络工具使用详解
    查看>>
    Net与Flex入门
    查看>>
    net包之IPConn
    查看>>
    Net操作配置文件(Web.config|App.config)通用类
    查看>>
    Neutron系列 : Neutron OVS OpenFlow 流表 和 L2 Population(7)
    查看>>
    New Relic——手机应用app开发达人的福利立即就到啦!
    查看>>
    NFinal学习笔记 02—NFinalBuild
    查看>>
    NFS
    查看>>
    NFS Server及Client配置与挂载详解
    查看>>
    NFS共享文件系统搭建
    查看>>
    nfs复习
    查看>>
    NFS安装配置
    查看>>
    NFS的安装以及windows/linux挂载linux网络文件系统NFS
    查看>>
    NFS的常用挂载参数
    查看>>
    NFS网络文件系统
    查看>>