阅读:1704回复:8
应用程序如何访问内核申请的一块静态内存
操作系统环境:Windows XP/2003
问题:在应用程序如何才能得到访问这块空间的用户虚拟地址? 我在驱动中分配了一块共享空间,现在已知这块空间的内核虚拟地址,物理地址。应用程序也可以得到这块空间的虚拟地址和物理地址,但是却不能直接使用内核虚拟地址进行访问,因为每个应用程序有它自己独立的空间,所以需要将这块空间映射到用户的虚拟地址上,向老牛们请教应该如何做? 补充说明:我的驱动程序可以提供需要的Support. |
|
沙发#
发布于:2008-07-15 14:38
第一次发言,麻烦知道的大大给个提示
|
|
板凳#
发布于:2008-07-15 16:32
可以通过驱动 自定义IOCTL码来实现。
|
|
地板#
发布于:2008-07-15 17:26
用MDL转换不知道是否可以?
|
|
|
地下室#
发布于:2008-07-15 20:56
引用第2楼petsatan于2008-07-15 16:32发表的 : 我申请的是一片很大的空间用来存放数据,让上层直接访问 用IOCTL好像效率就慢了一些。 引用第3楼stevensn于2008-07-15 17:26发表的 : 我在驱动做了MDL,请教应用层应该怎么访问? |
|
5楼#
发布于:2008-07-16 09:20
应用层访问的常规方法就是IOCTL,user mode 和kernel mode是隔离的,联通的方式就是DeviceIoControl,当然这是对于常规的WDM驱动,显示驱动可能不同。 你指的效率低,是指应用程序采用轮询的方式吧,如果采用驱动中进行事件通知的方式,效率是不会低,也就是说驱动中收到数据后,触发一个同步事件,释放正在等待的应用程序来处理。
|
|
|
6楼#
发布于:2008-07-16 10:28
我申请的这块内存是存放DMA传输过来的数据,当内存块被放满之后,通过IOCTL告诉应用程序自动去取。但是却不能用IOCTL去传输这么大一块数据,因为下一块数据马上又会来,所以最快的方式是让应用程序直接访问这块空间,实现数据零拷贝。
并且这块空间要同时让好几个应用程序访问,所以我希望在应用程序上做映射得到这块空间的虚拟地址,就是不知道应该怎么做。 |
|
7楼#
发布于:2008-07-18 13:09
MmMapxxx
|
|
8楼#
发布于:2008-07-22 09:20
请教具体怎么做
|
|