vmalloc()函数的工作方式类似于kmalloc(),只不过在前者分配的内存虚拟地址是连续的,而物理地址则无须连续;这也是用户空间分配函数的工作方式:由malloc()返回的页在进程的虚拟地址空间是连续的,但是,这并不保证它们在物理RAM中也是连续的;kmalloc()函数确保页在物理地址上是连续的(虚拟地址上自然也是连续的);vmalloc()函数只确保页在虚拟地址空间内是连续的;它通过分配非连续的物理内存块,再“修正”页表,把内存映射到逻辑地址空间的连续区域中;

大多数情况下,只有硬件设备需要得到物理地址连续的内存;在很多体系结构上,硬件设备存在于内存管理单元之外,它根本不理解什么是虚拟地址;因此,硬件设备用到的任何内存区域都必须是物理上连续的块,而不仅仅是虚拟地址上连续的块;而仅供软件使用的内存块就可以使用只有虚拟地址连续的内存块;

尽管在某些情况下才需要物理上连续的内存块,但是,很多内核代码都用kmalloc()来获得内存,而不是vmalloc();这主要是出于性能考虑;vmalloc()函数为了把物理上不连续的页转换成虚拟地址上连续的页,必须专门建立页表项;糟糕的是,通过vmalloc()获得的页必须一个一个地进行映射,这就会导致比直接存储映射大得多的TLB抖动;因为这个原因,vmalloc()仅在不得已时才会使用-典型的就是为了获得大块内存;

vmalloc()函数声明在<linux/vmalloc.h>中,原型如下:

 void *vmalloc(unsigned long size);

该函数返回一个指针,指向逻辑上连续的一块内存区,大小至少是size;发生错误时返回NULL;函数可能睡眠,因此,不能从中断上下文中调用,也不能从其他不允许阻塞的情况下进行调用;

要释放通过vmalloc()获得的内存,需要使用下面函数:

 void vfree(const void *addr)

这个函数会释放从addr开始的内存块,其中addr是由vmalloc返回的内存块地址;这个函数也可能睡眠,因此,不能从中断上下文中调用;

最新文章

  1. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server
  2. js倒计时-倒计输入的时间
  3. 数据结构之平衡查找树(AVL)
  4. C++预定义宏
  5. Ubuntu菜鸟入门(九)—— 支付宝支付控件安装
  6. TEX学习笔记
  7. Media Queries详解
  8. 《Linux设备驱动程序》 笔记1
  9. HDU ACM 1496 Equations
  10. ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
  11. sql不重复的查找统计数据(经典)
  12. python学习笔记三--字典的使用
  13. 在XML里的XSD和DTD以及standalone的使用2----具体使用详解
  14. actionscript sendToURL请求url,传递http_referer分浏览器统计
  15. rabbitmq-c初探
  16. numpy学习整理
  17. [POJ 3243]Clever Y
  18. 拷贝的表的SQL语句 SELECT INTO 和 INSERT INTO SELECT的用法与区别
  19. oracle 索引的创建与使用
  20. iOS任何界面全屏炫酷倒计时,一句代码就够了

热门文章

  1. Python Selenium、PIL、pytesser 识别验证码
  2. 实现Bootstrap表格拖拽
  3. 用js原生加jquery实现下拉跳转至商品详情页,上拉回到商品简介
  4. 配置Hadoop,hive,spark,hbase ————待整理
  5. [LeetCode] 219. Contains Duplicate II ☆(存在重复元素2)
  6. 《数据结构与算法之美》 &lt;07&gt;队列:队列在线程池等有限资源池中的应用?
  7. 03 WIndows编程——手绘函数调用过程
  8. markdown编辑器抉择经历(做笔记\多系统用户)
  9. LightOJ - 1151 Snakes and Ladders
  10. java学习笔记14-多态