Linux设备驱动程序 之 vmalloc
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返回的内存块地址;这个函数也可能睡眠,因此,不能从中断上下文中调用;
最新文章
- 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server
- js倒计时-倒计输入的时间
- 数据结构之平衡查找树(AVL)
- C++预定义宏
- Ubuntu菜鸟入门(九)—— 支付宝支付控件安装
- TEX学习笔记
- Media Queries详解
- 《Linux设备驱动程序》 笔记1
- HDU ACM 1496 Equations
- ARM-Linux S5PV210 UART驱动(2)---- 终端设备驱动
- sql不重复的查找统计数据(经典)
- python学习笔记三--字典的使用
- 在XML里的XSD和DTD以及standalone的使用2----具体使用详解
- actionscript sendToURL请求url,传递http_referer分浏览器统计
- rabbitmq-c初探
- numpy学习整理
- [POJ 3243]Clever Y
- 拷贝的表的SQL语句 SELECT INTO 和 INSERT INTO SELECT的用法与区别
- oracle 索引的创建与使用
- iOS任何界面全屏炫酷倒计时,一句代码就够了
热门文章
- Python Selenium、PIL、pytesser 识别验证码
- 实现Bootstrap表格拖拽
- 用js原生加jquery实现下拉跳转至商品详情页,上拉回到商品简介
- 配置Hadoop,hive,spark,hbase ————待整理
- [LeetCode] 219. Contains Duplicate II ☆(存在重复元素2)
- 《数据结构与算法之美》 <;07>;队列:队列在线程池等有限资源池中的应用?
- 03 WIndows编程——手绘函数调用过程
- markdown编辑器抉择经历(做笔记\多系统用户)
- LightOJ - 1151 Snakes and Ladders
- java学习笔记14-多态