dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2257回复:16

共享内存的分配问题?

楼主#
更多 发布于:2002-04-20 10:53
小弟现在想在vxd和win32程序之间共享一块内存(1M),这块内存想用来作数据采集板的数据转存,因此要在vxd的中断处理程序中进行存取,同时win32程序也要能将其读取并存储到硬盘。
请问高手,这块内存在哪分配较好(vxd or win32),可以分别用什么函数分配?这块内存在vxd中是否要锁定,才能保证该内存中的数据在采集过程中不会被侵占?

最新喜欢:

aasa2aasa2
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-20 14:34
各位高手,还有斑竹,快帮帮我阿!是不是我的问题太简单了!! :(  :( :( :(
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-21 15:11
怎么没人理我!我好伤心。。。。。 :(
yangyang
驱动中牛
驱动中牛
  • 注册日期2002-04-07
  • 最后登录2009-04-18
  • 粉丝0
  • 关注0
  • 积分368分
  • 威望67点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-21 15:23
有分吗?------吝啬!!!!哈哈  ;) ;) ;) ;) ;) ;)
等我一下,我会了就告诉你!!!!

[编辑 -  4/21/02 作者: yangyang]
欢迎大家访问中国电子开发网 http://www.cedn.cn vxworks资料库最全的网站
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-22 21:05
可以用MDL完成!我也是下载的www.safe123.com

一般的ring0的virtualaddress不能直接使用.
 如果需要ring0和ring3共享这部分缓冲,可以通过
以下的操作完成.
 SystemVirtualAddress = MmAllocateContiguousMemory(NumberOfBytes,
     HighestAcceptableAddress);
 或者:
 SystemVirtualAddress = ExAllocatePool(PoolType, NumberOfBytes);
 然后
 Mdl = IoAllocateMdl(SystemVirtualAddress, NumberOfBytes, FALSE,
                         FALSE, NULL);
 然后:
 如果缓冲区是非分页内存
 MmBuildMdlForNonPagedPool(Mdl);
 如果十分页内存:
 MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);
  
 ring3可以使用的virtual Address:
 UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
  
 然后应用程序就可以使用这部分的缓冲区了.

 给点分行吗??别太抠了!!  :)  :)
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-23 19:18
monkeyy:
   我是菜鸟,MDL是什么,我没听说过。能介绍一下吗?
 :P :P :P
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-25 20:30
monkeyy
我还是先给你分吧!
十分感谢你的帮助!!!!
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-25 20:45
不知道你做没做过win32共享内存!MDL就是内存映射文件对象。用于两个win32之间共享内存的。然而在98中由于3G-4G之间没有限制;所以也能用MDL,实质就是把高端地址映射到win32中!反正一句话,他能用就行了!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-25 21:06
vxd中也能使用mdl吗,第一次听说,下次试试。
不用那么麻烦的,你在应用程序中分配一段缓冲区,然后锁定后用deviceiocontrol将缓冲区地址传给vxd,vxd中好像也要锁定一下吧,然后就可以直接用了。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-27 20:18
zydcat
谢谢你的帮助!可是我找不到给分的钮了!!
另外在vxd中的锁定是不是用PageLock?


[编辑 -  4/27/02 作者: dongjun]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-04-28 08:48
不对,是用linepagelock。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-28 11:31
没错,是linepagelock,
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-29 09:27
zydcat:
厚着脸皮问一下,如果我在vxd中开一个1M的数组,再将其地址传给win32程序,这样使用可以吗?
另外,上次你所说的方法是不是直接在win32程序中new一块内存,(在win32中,用什么函数锁定,还想请问高手?) vxd中得到内存地址,之后锁定就可以在中断中安全访问了,对吗?能否贴一段例子给俺参考一下,先谢了!!!
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-29 09:47
其实不用共享内存就能实现你的要求,你就在VXD中定义一个数组存储数据采集板的数据,也不必用什么锁定,直接用deviceiocontrol在VXD和应用程序之间互相传输就行了,这就相当于VXD就是你的采集板,你的应用程序随时随地从它身上取数。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-29 11:51
1m的数组,好大呀,试试吧。
应用层锁定用GlobalLock()
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-04-29 13:27
1M的数组!我一定会在app层申请空间的。
建议象yanghaoyun同志说的那样做。
dongjun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-20
  • 最后登录2003-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-05-03 09:33
谢谢!楼上众位兄弟的热心帮助,没有给分,只是因为无法找到给分的键了,请大家到隔壁签名取分!!!!!
游客

返回顶部