edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2478回复: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-07-29 19:26
不明白“分页的内存也能在分发例程中执行”的意思,如果你是说在分发例程中也能够访问分页内存的话,那是肯定的,因为分发例程运行在PASSIVE_LEVEL上。

至于App和Driver的同步问题,需要程序员自己来解决,可以使用事件,但是当Driver运行在DISPATCH_LEVEL上时,要注意避免死锁的发生。我认为比较好的方法是使用二级缓冲区来实现。
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-30 08:33
能否举个例子来说明“当Driver运行在DISPATCH_LEVEL上时,要注意避免死锁的发生。我认为比较好的方法是使用二级缓冲区来实现”?是不是说一旦在Driver里锁定共享缓冲区,App就不可能访问这块共享缓冲区了?那用二级缓冲区又如何来实现呢?
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-07-30 11:14
我指的是你实现的同步机制,如果Driver在DISPATCH_LEVEL上等待运行于PASSIVE_LEVEL上的APP释放某个同步对象时,那么系统肯定就死翘翘了~~~

我指的二级缓冲区的意思是:如果Driver试图获得某个同步对象而失败时(例如当APP没有读完缓冲区中的数据时),那么它不应该继续等下去,而是应该将数据写入另外一个由Driver所分配的缓冲区中,当下次Driver获得了该同步对象时,再将在另外一个缓冲区中的数据拷贝到共享缓冲区中。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-30 14:55
可以考虑使用一种叫做time stamp的机制。
Tom_lyd
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-30 16:28
楼上的兄弟说可以用时间戳,但不知道如何来实现?
另:当App把数据写到共享缓冲区后,Driver如何把该数据写到板卡上去呢?是不是也得用事件告诉Driver?或者还是用DeviceIOControl()告诉Driver?如果是这样,根本就体现不出共享缓冲区的优点。应该有其他的好的方法!
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-30 16:35
还有,就是分页内存真能在App和Driver之间实现共享吗?我看过一本书,好像说这样是不可以的,唉,真是困惑!看来得自己好好的试一下!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-30 16:39
对,就是时间戳。这是我经常使用的一种方法。
xdjm说的很对,用一般的方法容易在DISPATCH_LEVEL造成死锁。
我实现的方法其实很简单,大致如下:
在你的共享内存的开始处增加一个字段即为时间戳字段。驱动程序每写一块内存,就置该字段为写标记。应用程序读时,首先检查该标志以保证其有效性。待其完全完成取操作后,将该字段清除。驱动程序就可以再次使用这块内存。
这种方法的好处在于不需要任何同步对象,避免了造成死锁的危险。
Tom_lyd
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-30 16:53
的确是一种好方法!就是在Buffer的起始位置设置一标志量,然后在每次读写时,先检查该标志量,我这样理解对不对?但如果是一个相反的过程,就是App到Driver,也可以用同样的方法,是吗?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-30 17:11
是的,对于从App到Driver我没有试过,但应该也是可以的。
Tom_lyd
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-07-30 17:22
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-30 17:22
谢谢版主!
那如果你来实现从App到Driver的数据传输,你会这么做呢?因为我不知道如何让App通知Driver,如果还是用DeviceIoControl来实现,那么共享缓冲区的优势根本就体现不出来!因为DeviceIoControl本来就可以自己把数据传下去呀。不知道版主会有什么好的解决方案?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-30 17:42
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?

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

不知道你如何认为这个问题,敢闻高见!
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于: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
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于: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分
15楼#
发布于:2002-07-30 18:12
这可能和我们做过的东西不同。我其实未涉到等待的问题。而仅仅是检测到下标记,以免覆盖。假如我把共享缓冲区组织成一个单链表,则置标记的节点在被清除之前不可再用。驱动程序应该尝试寻找下一个未用节点。如果搜索完整个链表依然没有找到,则返回失败。不进行等待操作。这样,应用程序一定有机会清除标志位。
你的方法也不失为一种好方法,下次我想我也会用的。
Tom_lyd
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-07-30 18:27
讨论还是很有收获的~~~ :D :D :D
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-30 18:28
是的,可是我要下班了,以后我们常沟通沟通,互相提高!OK?
Tom_lyd
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2002-07-30 18:33
当然当然~~~
edriver
驱动小牛
驱动小牛
  • 注册日期2002-03-04
  • 最后登录2006-09-15
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-31 11:09
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的?
1.用DeviceIoControl传一个event给Driver;
2.驱动程序巡检Shared memory里的标志位。
第二种方案肯定不行,因为driver还要干其他的事情呢,用线程又较麻烦;第一种方案根本体现不出Shared memory的优势来!
不知道还有其他的方法吗?
上一页
游客

返回顶部