阅读:2478回复:28
再问共享内存
“UserAddress=MnMapLockedPages(Mdl,UserMode),该例程一般在最高级的驱动程序的分发例程中执行”,但是分页的内存也能在分发例程中执行吗?另外,App和Driver如何在访问该共享内存时保持同步呢?还得用事件量吗?请高手指点
|
|
最新喜欢:![]() |
沙发#
发布于:2002-07-29 19:26
不明白“分页的内存也能在分发例程中执行”的意思,如果你是说在分发例程中也能够访问分页内存的话,那是肯定的,因为分发例程运行在PASSIVE_LEVEL上。
至于App和Driver的同步问题,需要程序员自己来解决,可以使用事件,但是当Driver运行在DISPATCH_LEVEL上时,要注意避免死锁的发生。我认为比较好的方法是使用二级缓冲区来实现。 |
|
板凳#
发布于:2002-07-30 08:33
能否举个例子来说明“当Driver运行在DISPATCH_LEVEL上时,要注意避免死锁的发生。我认为比较好的方法是使用二级缓冲区来实现”?是不是说一旦在Driver里锁定共享缓冲区,App就不可能访问这块共享缓冲区了?那用二级缓冲区又如何来实现呢?
|
|
地板#
发布于:2002-07-30 11:14
我指的是你实现的同步机制,如果Driver在DISPATCH_LEVEL上等待运行于PASSIVE_LEVEL上的APP释放某个同步对象时,那么系统肯定就死翘翘了~~~
我指的二级缓冲区的意思是:如果Driver试图获得某个同步对象而失败时(例如当APP没有读完缓冲区中的数据时),那么它不应该继续等下去,而是应该将数据写入另外一个由Driver所分配的缓冲区中,当下次Driver获得了该同步对象时,再将在另外一个缓冲区中的数据拷贝到共享缓冲区中。 |
|
地下室#
发布于:2002-07-30 14:55
可以考虑使用一种叫做time stamp的机制。
|
|
|
5楼#
发布于:2002-07-30 16:28
楼上的兄弟说可以用时间戳,但不知道如何来实现?
另:当App把数据写到共享缓冲区后,Driver如何把该数据写到板卡上去呢?是不是也得用事件告诉Driver?或者还是用DeviceIOControl()告诉Driver?如果是这样,根本就体现不出共享缓冲区的优点。应该有其他的好的方法! |
|
6楼#
发布于:2002-07-30 16:35
还有,就是分页内存真能在App和Driver之间实现共享吗?我看过一本书,好像说这样是不可以的,唉,真是困惑!看来得自己好好的试一下!
|
|
7楼#
发布于:2002-07-30 16:39
对,就是时间戳。这是我经常使用的一种方法。
xdjm说的很对,用一般的方法容易在DISPATCH_LEVEL造成死锁。 我实现的方法其实很简单,大致如下: 在你的共享内存的开始处增加一个字段即为时间戳字段。驱动程序每写一块内存,就置该字段为写标记。应用程序读时,首先检查该标志以保证其有效性。待其完全完成取操作后,将该字段清除。驱动程序就可以再次使用这块内存。 这种方法的好处在于不需要任何同步对象,避免了造成死锁的危险。 |
|
|
8楼#
发布于:2002-07-30 16:53
的确是一种好方法!就是在Buffer的起始位置设置一标志量,然后在每次读写时,先检查该标志量,我这样理解对不对?但如果是一个相反的过程,就是App到Driver,也可以用同样的方法,是吗?
|
|
9楼#
发布于:2002-07-30 17:11
是的,对于从App到Driver我没有试过,但应该也是可以的。
|
|
|
10楼#
发布于:2002-07-30 17:22
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?
|
|
11楼#
发布于:2002-07-30 17:22
谢谢版主!
那如果你来实现从App到Driver的数据传输,你会这么做呢?因为我不知道如何让App通知Driver,如果还是用DeviceIoControl来实现,那么共享缓冲区的优势根本就体现不出来!因为DeviceIoControl本来就可以自己把数据传下去呀。不知道版主会有什么好的解决方案? |
|
12楼#
发布于:2002-07-30 17:42
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢? 这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何? 但我认为是没有关系的。因为: 1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。 2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。 不知道你如何认为这个问题,敢闻高见! |
|
|
13楼#
发布于:2002-07-30 17:46
谢谢版主! App到Driver的数据传输有多种方法: 1.DeviceIoControl 2.WriteFile 3.Shared memory 其中可能以1较多见,但1通常用来传不是很大的数据,2方法则可以传较大数据块。而方法3的优势在于1或2都无法完成某项功能时才使用的一种方法。如果1或2就能实现功能,用3就显得没有必要。 |
|
|
14楼#
发布于:2002-07-30 17:50
[quote]有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢? 这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何? 但我认为是没有关系的。因为: 1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。 2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。 不知道你如何认为这个问题,敢闻高见! [/quote] 当Driver运行于DISPATCH_LEVEL上时,APP就没有机会来清除标志了,而运行于DISPATCH_LEVEL上的Driver也不能进行任何等待操作。这好象是个问题哦~~~如果我来实现的话,我还是选择二级缓冲区策略。 |
|
15楼#
发布于:2002-07-30 18:12
这可能和我们做过的东西不同。我其实未涉到等待的问题。而仅仅是检测到下标记,以免覆盖。假如我把共享缓冲区组织成一个单链表,则置标记的节点在被清除之前不可再用。驱动程序应该尝试寻找下一个未用节点。如果搜索完整个链表依然没有找到,则返回失败。不进行等待操作。这样,应用程序一定有机会清除标志位。
你的方法也不失为一种好方法,下次我想我也会用的。 |
|
|
16楼#
发布于:2002-07-30 18:27
讨论还是很有收获的~~~ :D :D :D
|
|
17楼#
发布于:2002-07-30 18:28
是的,可是我要下班了,以后我们常沟通沟通,互相提高!OK?
|
|
|
18楼#
发布于:2002-07-30 18:33
当然当然~~~
|
|
19楼#
发布于:2002-07-31 11:09
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的?
1.用DeviceIoControl传一个event给Driver; 2.驱动程序巡检Shared memory里的标志位。 第二种方案肯定不行,因为driver还要干其他的事情呢,用线程又较麻烦;第一种方案根本体现不出Shared memory的优势来! 不知道还有其他的方法吗? |
|
上一页
下一页