Linux 内存管理之vmalloc
嵌入式Linux
共 2269字,需浏览 5分钟
· 2021-05-15
走进vmalloc
根据前面的系列文章,我们知道了buddy system是基于页框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的。但是随着碎片化的积累,连续物理内存的分配就会变得困难,对于那些非DMA访问,不一定非要连续物理内存的话完全可以像malloc那样,将不连续的物理内存页框映射到连续的虚拟地址空间中,这就是vmap的来源)(提供把离散的page映射到连续的虚拟地址空间),vmalloc的分配就是基于这个机制来实现的。
vmalloc最小分配一个page,并且分配到的页面不保证是连续的,因为vmalloc内部调用alloc_page多次分配单个页面。
vmalloc的区域就是在上图中VMALLOC_START - VMALLOC_END之间,可通过/proc/vmallocinfo查看。
数据结构
vmap_area 描述一段虚拟地址的区域,可以将struct vm_struct构成一个链表,维护多段映射。
struct vmap_area {
unsigned long va_start; //vmalloc申请虚拟地址返回的起始地址
unsigned long va_end; //vmalloc申请申请虚拟地址返回的结束地址
unsigned long flags;
//挂接到vmap_area_root红黑树
struct rb_node rb_node; /* address sorted rbtree */
//挂接到vmap_area_list链表
struct list_head list; /* address sorted list */
struct llist_node purge_list; /* "lazy purge" list */
//如果当前VA处于使用状态(即在vmap_area_root为根的红黑树中和vmap_area_list链表中),vm有效,指向用于管理虚拟地址和物理页之间的映射关系的描述符
struct vm_struct *vm;
struct rcu_head rcu_head;
};
vm_struct 管理虚拟地址和物理页之间的映射关系
struct vm_struct {
struct vm_struct *next; //指向下一个vm结构体
void *addr; //当前vmalloc区域的虚拟地址的起始地址
unsigned long size; //当前vmalloc区域的虚拟地址的大小
unsigned long flags;
//vamlloc分配获取的各个物理页面并是不连续的,每个物理页面用struct page描述,一个vm_struct对用到的管理所有物理页面的struct page构成一个数组,而pages就是指向这个数组的指针。
struct page **pages;
unsigned int nr_pages; //vmalloc映射的page数目
phys_addr_t phys_addr; //用来映射硬件设备的IO共享内存,其他情况下为0
const void *caller; //调用vmalloc函数的函数的地址
};
vmalloc
主要分以下三步:
从VMALLOC_START到VMALLOC_END查找空闲的虚拟地址空间(hole) 根据分配的size,调用alloc_page依次分配单个页面. 把分配的单个页面,映射到第一步中找到的连续的虚拟地址。把分配的单个页面,映射到第一步中找到的连续的虚拟地址。
评论
6 个火爆 GitHub 的后台管理模板,快来收藏!
将Python客栈设为“星标⭐”第一时间收到最新资讯今天来给大家介绍6个火爆 G 站的管理后台模板,有了它们,对于前端不是很熟悉的小伙伴来说,再也不用烦恼了,而且有一说一,即使是前端大牛,要想从零开发一套完整的管理模板,也不是一件容易的事情。1. vue-element-admin该项目是基于 Vu
Python客栈
0
得物面试:Redis 内存碎片是什么?如何清理?
JavaGuide官方网站:javaguide.cn这是一道不是特别高频但很重要的 Redis 面试题,属于 Redis 性能优化的范畴。Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过,还是建议认真准备一下。即使不是准备面试,日常开发也是能够用到的!什么是内
JavaGuide
0
单片机转Linux,看这份学习清单!
关注、星标公众号,直达精彩内容来源 | 网络俗话说万事开头难,刚开始的时候,你是否根本就不知如何开始,上网查资料被一堆堆新名词搞的找不到北,去图书馆看书也是找不到方向?又是arm,又是linux,又是uboot头都大了,不知道自己究竟从哪里开始?下面就跟着我学习设计嵌入式
李肖遥
0
原子化状态管理库 Jotai,它和 Zustand 有啥区别?
Jotai 是一个 react 的状态管理库,主打原子化。提到原子化,你可能会想到原子化 CSS 框架 tailwind。比如这样的 css:<div class="aaa"></div>.aaa { font
前端桃园
0
600个常用 Linux 命令,收藏备用!
本文为Linux命令大全 ,从A到Z都有总结,建议大家收藏以便查用,或者查漏补缺!A命令描述access用于检查调用程序是否可以访问指定的文件,用于检查文件是否存在accton用于打开或关闭记帐进程或更改信息进程记帐文件aclocal用于从configure.in文件自动生成aclocal.m4文件
程序IT圈
0
Linux 新变革已经开始,文本三剑客地位不保!
众所周知,在 Linux 系统中,awk、grep、sed 这三个命令,因其功能强大,日常使用频繁,在 Linux 系统下处理文本是个非常不错的神器,grep 用于查找,sed 用于取行和替换,awk 用于运算。因此,这三个命令一直都有着文本三剑客的称号!但是,随着这个命令的出现,怕是三剑客的地位要
良许Linux
0
带你玩转Linux系统之lscpu命令
链接:https://bbs.huaweicloud.com/blogs/422603一、lscpu命令介绍lscpu 是一个 Linux 命令,用于显示CPU架构的详细信息。它可以用来查看 CPU 的型号、主频、架构、虚拟化支持等。二、lscpu命令的使用帮助2.1 命令格式lscpu [选项]2
良许Linux
0
Linux 配置和管理网络接口的基本命令
更多Python学习内容:ipengtao.com在Linux系统中,网络接口的配置和管理是系统管理员日常工作的一部分。了解如何有效地使用命令行工具进行网络接口配置是至关重要的。本文将详细介绍一些基本的Linux网络接口管理命令,提供详实的示例代码,帮助管理员更全面地了解和掌握这些工具。ifconf
良许Linux
0