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

本文共 2214 字,大约阅读时间需要 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 + uWSGI + Flask + Vhost
    查看>>
    Nginx - Header详解
    查看>>
    nginx 1.24.0 安装nginx最新稳定版
    查看>>
    nginx css,js合并插件,淘宝nginx合并js,css插件
    查看>>
    Nginx gateway集群和动态网关
    查看>>
    Nginx Location配置总结
    查看>>
    Nginx Lua install
    查看>>
    Nginx upstream性能优化
    查看>>
    Nginx 中解决跨域问题
    查看>>
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>