Linux 内存管理之vmalloc

走进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共享内存,其他情况下为0const void  *caller; //调用vmalloc函数的函数的地址
};

vmalloc

主要分以下三步:

  1. 从VMALLOC_START到VMALLOC_END查找空闲的虚拟地址空间(hole)

  2. 根据分配的size,调用alloc_page依次分配单个页面.

  3. 把分配的单个页面,映射到第一步中找到的连续的虚拟地址。把分配的单个页面,映射到第一步中找到的连续的虚拟地址。


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

composer不成功的原因

1在下载好composer.setup的过程中,出现了错误,安装好composer.setup后并没有在path中出现关于composer.setup/bin的目录,如果没有出现这个path的这个路径的话,那么你在cmd里面就会出现找不到这条命令的情况 2.安装好phpstudy的这个…

《观止》书评

收到《观止》一书已经一周了,因为工作很忙的原因,前几天完全没有看。到了周末才稍有点空闲,便拿起手边的这本《观止》一起。谁知一“观”而无法“止”。硬是活生生的占用了我整个本来打算用来补觉的周末。 严格说来《观止》并不算是技术书籍…

每日一题(12)—— .h头文件中ifndef/define/endif的作用

.h头文件中ifndef/define/endif的作用? 分析: 防止头文件被重复包含。 #ifndef _TEST_H_ #define _TEST_H_/* test.h */#endif /* _TEST_H_ */假如在a文件和b文件中都使用这个test.h,假如编译器先编译a,执行.h的内容&#xff0…

进程是如何使用内存的?

程序运行概述程序(我们这里只讨论单进程情况,存在多进程的程序如淘宝微信等不展开讨论)镜像存在磁盘中,运行时将镜像加载至内存RAM中,然后开始执行。先来看一下CPU的多级存储结构,CPU通用寄存器访问速度最快…

如何用SQLDMO在ASP.NET页面下实现数据库的备份与恢复

我们知道&#xff0c;用SQLDMO可以实现对数据库的备份与恢复&#xff0c;下面给出简单的实现方法。首先需要添加对SQLDMO引用1.实现数据库的备份&#xff1a;1/**//// <summary> 2 /// 数据库备份 3 /// </summary> 4 /// <returns>备份…

每日一题(13)—— #includefile.h 与 #include “file”的区别

#include<file.h> 与 #include “file”的区别&#xff1f; #include<file.h>&#xff1a;编译器从标准库路径开始搜索file.h&#xff1b; #include “file”&#xff1a; 编译器先从当前目录下搜索file.h&#xff0c;找不到&#xff0c;再到标准库路径搜索file…

TP4056 实现可编程锂电充电器+电量计

本文作者&#xff1a;t3486784401链接&#xff1a;https://www.mydigit.cn/forum.php?modviewthread&tid250916&extra手头有些容量非常小的软包锂电&#xff0c;直接使用市面上的大功率充电板&#xff08;500mA/1A&#xff09;倍率太大&#xff0c;容易损坏电池。索性…

ASP.NET获取路径的方法

HttpContext.Current.Request.PhysicalPath; // 获得当前页面的完整物理路径.比如 F:\XFU.NSQS\project\website\Default.aspxHttpContext.Current.Request.PhysicalApplicationPath; // 获得当前程序运行的物理路径比 如F:\XFU.NSQS\project\website\HttpContext.Current.S…

《我也能做CTO之.程序员职业规划》 水准之上,期望以下

高老师的新作已经大致拜读了&#xff0c;看完之后确实有点不吐不快的话。在这献丑一说&#xff0c;大家多批评指正。个人感觉老老师这书写的实在是&#xff0c;水准以上&#xff0c;期望之下。这话怎么解呢&#xff0c;简单的说&#xff0c;确实这书达到了高老师的平均水准&…

电车防盗报警器电路原来是这样的!

前几天电路菌从电车上拆开了一个防盗报警器&#xff0c;今天来看看防盗报警器这内部的电路到底是怎样的&#xff01;上图就是防盗报警器的主机&#xff0c;引出来的这根黑线是天线。在防盗报警主机的侧面&#xff0c;可以看到印刷有文字“RP-48V-64V”&#xff0c;应该是指这主…

vue 重定向

//重定向 { path: /*, component: Home} 转载于:https://www.cnblogs.com/1032473245jing/p/9018304.html

每日一题(14)—— 交换a,b的值(不使用中间变量)

如何将a,b的值进行交换&#xff0c;并且不使用任何中间变量&#xff1f; 推荐答案&#xff1a; a a ^ b; b a ^ b; a a ^ b; 下面的答案不好&#xff0c;可能会导致越界的问题 a a b; // 可能越界 b a - b; a a - b;

买到假芯片,血的教训!

关注星标公众号&#xff0c;不错过精彩内容作者 | 写代码的篮球球痴素材来源 | 云汉芯城2021年太难了&#xff0c;芯片涨价不说&#xff0c;涨价之后还买不到芯片&#xff0c;芯片交货周期已经超过一年了。嵌入式Linux1涨价、缺货 ——> 翻新、假货在芯片涨价、缺货的背景下…

Windows 7 :微软目前最好的操作系统

好消息&#xff0c;各位&#xff01;如果你是 PC 用户&#xff0c;如果你仍然在使用有 8 年历史的 Windows XP&#xff0c;或者令人讨厌的 Windows Vista &#xff0c;现在你终于可以解脱了&#xff1a;Windows 7 就在眼前。微软交付了一套设计巧妙、改进巨大的操作系统&#x…

[Robot Framework] 怎么做数学运算?

运用BuiltIn里面的Set Variable 转载于:https://www.cnblogs.com/MasterMonkInTemple/p/9020406.html

每日一题(15)—— static有什么用途

static有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; (1) 在函数体&#xff0c;一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 (2) 在模块内&#xff08;但在函数体外&#xff09;&#xff0c;一个被声明为静态的变量可以被模块内所用函数访问…

解剖几个有点难度的C笔试题

总结了几个比较经典的笔试题目&#xff0c;这些题目是在面试中遇到的&#xff0c;有难度&#xff0c;但是不是那种特别难的&#xff0c;比较有代表性&#xff0c;如果正在找工作的话&#xff0c;可以看看&#xff0c;丰富一下自己的知识库。1.题目一求下面代码输出&#xff1a;…

亲试白天使:华硕家用级无线路由RT-N11+

拿到机子2个礼拜&#xff0c;说实话&#xff0c;对于我来说&#xff0c;家庭用ASUS RT-N11还是很够给力的。 华硕RT-N11产品资料 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />无线网络 802.11n Draft 2.0 WAN接口 100Mbps1 L…

基于PHP实现一个简单的在线聊天功能(轮询ajax )

基于PHP实现一个简单的在线聊天功能&#xff08;轮询ajax &#xff09; 一、总结 1、用的轮询ajax 二、基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻烦的是前端展..于是.. 需求分析 要实现功能,首先要做前端,经过…

C笔试题指针

解剖几个有点难度的C笔试题昨天写的那个面试题&#xff0c;今天在群里讨论&#xff0c;有个同学加工了下&#xff0c;变成了新的题目&#xff0c;写出来大家一起看看。#include <stdio.h> struct node {int a;int b;int c; }; int main() {struct node s {3,5,6};int*pt …