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

    你可能感兴趣的文章
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>