下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在驱动和应用程序间共享内存(二)2008-12-1516:27分配并且映射页:现在剩下了前面提到的第二种方法:分配内存页并且映射这些页到特定进程的用户虚拟地址空间上。使用大多数驱动编写者常见的,这个方法令人惊讶的容易,同时也允许驱动对分配内存的类型具有最大的控制能力。驱动无论使用什么标准方法,都是希望分配内存来共享。例如,如果驱动需要一个适当的设备(逻辑)地址作,就像内存块的内核虚拟地址,它能够使用来分配内存。如果没有要求特定的内存特性,要被共享的内存大小也是适度的,驱动可以将填充、非分页物理内存页分配给。e从主内存分配填充、非分页的页面,使用或者。这些函数返回一个描述内存的分配。驱动使用函数
2、映射描述的页到内核虚拟地址空间。从主内存分配页比使用分页内存池或者非分页内存池得到的内存更加安全,后者不是一个好主意。:这种方式是内核来分配内存空间,但是是使用从主内存池中分配,返回得到一个,对于驱动如何使用该共享内存,采用得到其内核地址。对于应用层使用该共享内存,采用映射到应用层进程地址空间中,返回用户层地址空间的起始地址,将其放在中返回给用户应用程序。口借助一个用来描述共享内存的,驱动现在准备映射这些页到用户进程地址空间。这可以使用函数来实现。你需要知道调用这个函数的窍门是:你必须在你希望映射的进程上下文中调用这个函数。,::如果是在别的进程上下文中调用,就变成了映射到其他进程上下文中了,
3、但是我如何保/谖蚁m成銪的进程上下文调用呢?设定参数为。对函数调用返回值是描述内存页映射的用户虚拟地址空间地址。驱动可以将其放在对应的缓存中给用户应用程序。口你需要有一个方法,在不需要时将分配的内存清除掉。换句话说,你需要调用来释放内存页。并且调用来释放由创建的。你几乎都是在你驱动的处理例程()或者事件处理回调(中作这个工作)。这是所要做的,综合起来,完成这个过程的代码见下面。数*V:t初始化需要的u地a分配的共享缓冲区映射共享缓冲区到用户地址空间返回,得到和用户层的虚拟地址当然,这种方法也有缺点,调用必须在你希望内存页被映射的进程上下文来做。较之使用的方法,该方法表现出不必其更多的灵活性。然
4、而,不像前者,后者只需一个函数()在目标上下文被调用。由于很多设备驱动在设备栈中只有一个且直接基于总线的(也就是在其上没有别的设备,除了总线驱动其下没有别的驱动),这个条件很容易满足。对于那些少量的设备驱动,处于设备栈的深处并且需要和用户模式应用直接共享的,一个企业级的驱动编写者可能能找到一个安全的地方在请求的进程上下文中调用。在页面被映射以后,共享内存就可以象使用的方法一样,能够在任意的进程上下文被存取,也可以在高上存取(因为共享内存来之非分页内存)。:需要我们确定的一点就是何时调用安全的映射到指定进程的上下文中。还有一点,就是该共享内存处于非分页内存中,所以可以在搞上存取。如果你使用这种方
5、法,有一个决定性的事情一直要记者:你必须确信你的驱动要提供方法,在任何时候用户进程退出的时候,能够将你映射到用户空间的页面作取消映射的操作。这件事情的失败会导致系统在应用层退出的时候崩溃。我们找到一个简单方法就是无论何时应用层关闭设备句柄,则对这些页面作取消映射操作。由于应用层关闭句柄,出现意外或者其他情况,驱动将收到对应于该应用层打开的设备文件对象的一个,你可以确信这是工作的。你将在求线程的上下文中得到使执行这些操作,而不是,因为你可以保证在请。下面代码可以看见分配资源的释放。解除映射释放锁定的物理页释放其他挑战:无论使用哪种机制,驱动和应用程序将需要支持同步存取共享内存的通用方式,这可以通
6、过很多许多方法来做。可能最简单的机制是共享一个或者多个命名事件。应用和驱动共享事件的最简单方法就是应用层生成事件,然后将事件句柄传递给驱动层。驱动然后从应用层的上下文中事件句柄。如果你使用这种方法,请不要忘记在驱动的处理代码中这个句柄。:一定要注意解引用来自应用层的事件对象。总结:我们观察了两种在驱动和用户模式应用程序共享内存的方法:1用户层创建缓冲区并且通过传递给驱动2在驱动中使用分配内存页,得到,然后将该所描述的内存映射到用户层地址空间()。得到用户地址空间的起始地址,并通过返回给用户层。译者注:在使用命名事件来同步驱动和应用程序共享缓冲区时,一般不要使用驱动程序创建命名事件,然后根据应用程序名称打开的方法。这种方法虽然可以使得驱动激活事件后,所有相关应用程序都能够被唤醒,方便程序的开发,但是他有两个问题:一是命名事件只有在子系统起来后才能正确创建,这会影响到驱动程序开发。最严重的问题是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论