本篇内容主要讲解“Linux中的vmalloc有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中的vmalloc有什么作用”吧!
根据前面的系列文章,我们知道了buddy system是基于页框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的。但是随着碎片化的积累,连续物理内存的分配就会变得困难,对于那些非DMA访问,不一定非要连续物理内存的话完全可以像malloc那样,将不连续的物理内存页框映射到连续的虚拟地址空间中,这就是vmap的来源)(提供把离散的page映射到连续的虚拟地址空间),vmalloc的分配就是基于这个机制来实现的。
vmalloc最小分配一个page,并且分配到的页面不保证是连续的,因为vmalloc内部调用alloc_page多次分配单个页面。
vmalloc的区域就是在上图中VMALLOC_START - VMALLOC_END之间,可通过/proc/vmallocinfo查看。
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;};
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函数的函数的地址};
主要分以下三步:
到此,相信大家对“Linux中的vmalloc有什么作用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4585157/blog/5010693