阅读:2477回复:28
再问共享内存
“UserAddress=MnMapLockedPages(Mdl,UserMode),该例程一般在最高级的驱动程序的分发例程中执行”,但是分页的内存也能在分发例程中执行吗?另外,App和Driver如何在访问该共享内存时保持同步呢?还得用事件量吗?请高手指点
|
|
最新喜欢:![]() |
沙发#
发布于:2002-08-06 13:06
可是UserAddress=MnMapLockedPages(Mdl,UserMode);这句话是放在我的Driver里的,那么我的App如何识别它呢?是不是用DeviceIoControl()传上去的呢? 是的。 |
|
板凳#
发布于:2002-08-05 14:11
可是UserAddress=MnMapLockedPages(Mdl,UserMode);这句话是放在我的Driver里的,那么我的App如何识别它呢?是不是用DeviceIoControl()传上去的呢?
|
|
地板#
发布于: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! |
|
地下室#
发布于:2002-08-05 09:42
MmProbeAndLockedPages
|
|
|
5楼#
发布于:2002-08-05 09:29
另外,在使用分页内存时,如何锁定呢?真的很急,谢谢!
|
|
6楼#
发布于:2002-08-05 09:27
请问xdjm:UserAddress=MnMapLockedPages(Mdl,UserMode),那么如何在我的应用程序里面使用UserAddress呢?因为UserAddress是在Driver里定义的!
|
|
7楼#
发布于:2002-07-31 12:56
xdjm,不知道共享内存的分配是不是只限于非分页内存呢?因为我的Driver要用DMA进行大数据量传输,如果频繁的使用非分页内存,肯定会影响系统资源的,所以我打算采取分页内存来作 可以使用分页内存,但是好象必须锁定才行。 |
|
8楼#
发布于:2002-07-31 11:33
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的? 至于通知,就是用共享Event,或者是用命名Event(这只能在NT4.0以上的版本中才有用),其它的方法我没有做过。至优势,我认为是一个折衷的的问题。我倒认为,只要功能实现了,多数时候是不需要考虑什么优势的。 |
|
|
9楼#
发布于:2002-07-31 11:13
xdjm,不知道共享内存的分配是不是只限于非分页内存呢?因为我的Driver要用DMA进行大数据量传输,如果频繁的使用非分页内存,肯定会影响系统资源的,所以我打算采取分页内存来作
|
|
10楼#
发布于:2002-07-31 11:09
版主,我的意思就是只限于“3.Shared memory”,也就是说,在这种情况下,当App把数据写到Shared memory后,Driver是如何得到通知的?
1.用DeviceIoControl传一个event给Driver; 2.驱动程序巡检Shared memory里的标志位。 第二种方案肯定不行,因为driver还要干其他的事情呢,用线程又较麻烦;第一种方案根本体现不出Shared memory的优势来! 不知道还有其他的方法吗? |
|
11楼#
发布于:2002-07-30 18:33
当然当然~~~
|
|
12楼#
发布于:2002-07-30 18:28
是的,可是我要下班了,以后我们常沟通沟通,互相提高!OK?
|
|
|
13楼#
发布于:2002-07-30 18:27
讨论还是很有收获的~~~ :D :D :D
|
|
14楼#
发布于:2002-07-30 18:12
这可能和我们做过的东西不同。我其实未涉到等待的问题。而仅仅是检测到下标记,以免覆盖。假如我把共享缓冲区组织成一个单链表,则置标记的节点在被清除之前不可再用。驱动程序应该尝试寻找下一个未用节点。如果搜索完整个链表依然没有找到,则返回失败。不进行等待操作。这样,应用程序一定有机会清除标志位。
你的方法也不失为一种好方法,下次我想我也会用的。 |
|
|
15楼#
发布于:2002-07-30 17:50
[quote]有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢? 这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何? 但我认为是没有关系的。因为: 1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。 2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。 不知道你如何认为这个问题,敢闻高见! [/quote] 当Driver运行于DISPATCH_LEVEL上时,APP就没有机会来清除标志了,而运行于DISPATCH_LEVEL上的Driver也不能进行任何等待操作。这好象是个问题哦~~~如果我来实现的话,我还是选择二级缓冲区策略。 |
|
16楼#
发布于:2002-07-30 17:46
谢谢版主! App到Driver的数据传输有多种方法: 1.DeviceIoControl 2.WriteFile 3.Shared memory 其中可能以1较多见,但1通常用来传不是很大的数据,2方法则可以传较大数据块。而方法3的优势在于1或2都无法完成某项功能时才使用的一种方法。如果1或2就能实现功能,用3就显得没有必要。 |
|
|
17楼#
发布于:2002-07-30 17:42
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢? 这种问题我确实没有考虑过,不知道你对这种情况的处理方法如何? 但我认为是没有关系的。因为: 1.应用程序会直到将所有数据读完老才清除标志字段,这保证了缓冲区不会被驱动程序覆盖。 2.在读的过程中被中断,系统应该会自动保存现场,当线程被重新调时,现场又被恢复。所有我认为应该能够读到完整、正确的数据。 不知道你如何认为这个问题,敢闻高见! |
|
|
18楼#
发布于:2002-07-30 17:22
谢谢版主!
那如果你来实现从App到Driver的数据传输,你会这么做呢?因为我不知道如何让App通知Driver,如果还是用DeviceIoControl来实现,那么共享缓冲区的优势根本就体现不出来!因为DeviceIoControl本来就可以自己把数据传下去呀。不知道版主会有什么好的解决方案? |
|
19楼#
发布于:2002-07-30 17:22
有一个问题,不知道各位兄弟考虑过没有?那就是,如果APP在读数据而没有读完之前被Driver中断了的话,那该怎么办,那APP所读到的数据是不是会不完整呢?
|
|
上一页
下一页