edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2477回复:28

再问共享内存

楼主#
更多 发布于:2002-07-29 17:46
“UserAddress=MnMapLockedPages(Mdl,UserMode),该例程一般在最高级的驱动程序的分发例程中执行”,但是分页的内存也能在分发例程中执行吗?另外,App和Driver如何在访问该共享内存时保持同步呢?还得用事件量吗?请高手指点

最新喜欢:

abc0099abc009...
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-08-06 13:06
可是UserAddress=MnMapLockedPages(Mdl,UserMode);这句话是放在我的Driver里的,那么我的App如何识别它呢?是不是用DeviceIoControl()传上去的呢?  

是的。
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-05 14:11
可是UserAddress=MnMapLockedPages(Mdl,UserMode);这句话是放在我的Driver里的,那么我的App如何识别它呢?是不是用DeviceIoControl()传上去的呢?
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-08-05 13:25
1。UserAddress可以直接在APP中使用,例如:UserAddress[0]=1;
2。关于分页内存,你可以这么做:

PMDL Mdl = IoAllocateMdl(
  VirtualAddress, // 分页内存的虚拟地址。
  NumberOfBytes,
  FALSE,
  FALSE,
  NULL);

MmProbeAndLockPages(Mdl,KernelMode,IoWriteAccess); // 锁定它

PVOID UserAddress = MmMapLockedPages(Mdl,UserMode);

OK!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-05 09:42
MmProbeAndLockedPages
Tom_lyd
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-05 09:29
另外,在使用分页内存时,如何锁定呢?真的很急,谢谢!
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-05 09:27
请问xdjm:UserAddress=MnMapLockedPages(Mdl,UserMode),那么如何在我的应用程序里面使用UserAddress呢?因为UserAddress是在Driver里定义的!
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-07-31 12:56
xdjm,不知道共享内存的分配是不是只限于非分页内存呢?因为我的Driver要用DMA进行大数据量传输,如果频繁的使用非分页内存,肯定会影响系统资源的,所以我打算采取分页内存来作

可以使用分页内存,但是好象必须锁定才行。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-31 11:33
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的?
1.用DeviceIoControl传一个event给Driver;
2.驱动程序巡检Shared memory里的标志位。
第二种方案肯定不行,因为driver还要干其他的事情呢,用线程又较麻烦;第一种方案根本体现不出Shared memory的优势来!
不知道还有其他的方法吗?
 

至于通知,就是用共享Event,或者是用命名Event(这只能在NT4.0以上的版本中才有用),其它的方法我没有做过。至优势,我认为是一个折衷的的问题。我倒认为,只要功能实现了,多数时候是不需要考虑什么优势的。
Tom_lyd
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-31 11:13
xdjm,不知道共享内存的分配是不是只限于非分页内存呢?因为我的Driver要用DMA进行大数据量传输,如果频繁的使用非分页内存,肯定会影响系统资源的,所以我打算采取分页内存来作
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-31 11:09
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的?
1.用DeviceIoControl传一个event给Driver;
2.驱动程序巡检Shared memory里的标志位。
第二种方案肯定不行,因为driver还要干其他的事情呢,用线程又较麻烦;第一种方案根本体现不出Shared memory的优势来!
不知道还有其他的方法吗?
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-07-30 18:33
当然当然~~~
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-30 18:28
是的,可是我要下班了,以后我们常沟通沟通,互相提高!OK?
Tom_lyd
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-07-30 18:27
讨论还是很有收获的~~~ :D :D :D
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-30 18:12
这可能和我们做过的东西不同。我其实未涉到等待的问题。而仅仅是检测到下标记,以免覆盖。假如我把共享缓冲区组织成一个单链表,则置标记的节点在被清除之前不可再用。驱动程序应该尝试寻找下一个未用节点。如果搜索完整个链表依然没有找到,则返回失败。不进行等待操作。这样,应用程序一定有机会清除标志位。
你的方法也不失为一种好方法,下次我想我也会用的。
Tom_lyd
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-07-30 17:50
[quote]有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?

这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何?
但我认为是没有关系的。因为:
1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。
2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。

不知道你如何认为这个问题,敢闻高见! [/quote]
当Driver运行于DISPATCH_LEVEL上时,APP就没有机会来清除标志了,而运行于DISPATCH_LEVEL上的Driver也不能进行任何等待操作。这好象是个问题哦~~~如果我来实现的话,我还是选择二级缓冲区策略。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-30 17:46
谢谢版主!
那如果你来实现从App到Driver的数据传输,你会这么做呢?因为我不知道如何让App通知Driver,如果还是用DeviceIoControl来实现,那么共享缓冲区的优势根本就体现不出来!因为DeviceIoControl本来就可以自己把数据传下去呀。不知道版主会有什么好的解决方案?

App到Driver的数据传输有多种方法:
1.DeviceIoControl
2.WriteFile
3.Shared memory

其中可能以1较多见,但1通常用来传不是很大的数据,2方法则可以传较大数据块。而方法3的优势在于1或2都无法完成某项功能时才使用的一种方法。如果1或2就能实现功能,用3就显得没有必要。
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-30 17:42
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?

这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何?
但我认为是没有关系的。因为:
1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。
2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。

不知道你如何认为这个问题,敢闻高见!
Tom_lyd
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-30 17:22
谢谢版主!
那如果你来实现从App到Driver的数据传输,你会这么做呢?因为我不知道如何让App通知Driver,如果还是用DeviceIoControl来实现,那么共享缓冲区的优势根本就体现不出来!因为DeviceIoControl本来就可以自己把数据传下去呀。不知道版主会有什么好的解决方案?
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2002-07-30 17:22
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?
上一页
游客

返回顶部