阅读:3017回复:19
关于sys驱动和dll之间的区别
现在有两个应用程序AppWr,AppMt,一个内核驱动程序dev。AppWr对Dev进行写操作,AppMt对Dev的状态进行监控。过程:
AppMt创建一个事件event,将event的句柄传给Dev。然后创建一个等待线程,对这个event进行监控。 当AppWr对Dev进行写操作时,Dev将激活event,此时AppMt等待线程得以恢复执行。 我觉得很奇怪,为什么这样做能成功。我记得书上说,sys驱动程序其实是一个动态链接库。AppWr和AppMt是两个进程,两个进程分别加载了这个动态链接库,但它们的进程空间还是相互独立的,也就是说AppWr进程空间中所看到的event和AppMt进程空间中的event应该是不一样的啊! 我用一个dll来代替上面的dev,做了一个测试,发现运行结果有变化:AppMt无法监控到event!AppWr和AppMt进程所看到的event确实不一样。难道书上的说法不恰当? 请大侠们给我解释一下驱动程序和一般的dll的区别。谢谢! |
|
最新喜欢:mapofl |
沙发#
发布于:2002-08-05 16:51
你的说法好像有矛盾
appwr appmt sys这个组合中,appwr并没有对event作任何操作 只有appmt创建,sys设置而已, |
|
|
板凳#
发布于:2002-08-05 17:07
event是内部对象,你只要能得到他的handle,有足够的权限,就可以访问。
所以,就是appmt给event的handle给dev,dev来操作这个event。 appwt和这个event发生不正当的关系了吗? :D |
|
地板#
发布于:2002-08-05 17:09
而在第二种情况又让appwr去看event, 两种情况前提不成立 |
|
|
地下室#
发布于:2002-08-05 17:14
先问这个:
AppWr和AppMt启动并打开dev设备时,系统是不是把dev.sys分别映射到它们的进程空间中,然后这两个进程空间分别保存有dev中的数据的“副本”?就象进程对dll的加载一样? 这是最关键的地方。谢谢! |
|
5楼#
发布于:2002-08-05 17:23
谢谢前面两位的回答。
我可能没有把我的问题阐述清楚。 我是怀疑,AppWr打开Dev时,dev会映射到AppWr的进程空间中; AppMt又打开Dev时,Dev又会映射到AppMt的进程空间中。 也就是说,在这个组合中,实际上是存在两个不同的Dev: AppWr--Dev_1--event_1 AppMt--Dev_2--event_2 当AppWr对Dev进行写操作时,实际上是Dev_1对event_1进行了设置。 而AppMt监视的是Dev_2设置的事件event_2。 不知道我的理解对不对 可能有点幼稚。见笑了:) |
|
6楼#
发布于:2002-08-05 17:25
应该不是这样的
|
|
|
7楼#
发布于:2002-08-05 17:27
no
sys在2G上面的空间,不属于2G下面的app空间。不像dll。sys只有一份的。 |
|
8楼#
发布于:2002-08-05 17:37
再次感谢!
那么这样就产生了一个问题: 可以想象在双cpu这样一种最坏的情况 如果两个app同时对dev发出了一个相同的IRP,那么Dev中对这个IPR的处理例程会如何运行?如果没有“副本”一说,那么两个IRP岂不是在同一个内存区中跑动?该分发例程中的每一个局部变量岂不是要被访问甚至修改两次? |
|
9楼#
发布于:2002-08-05 17:43
建议看看waly oney的书。说的比较清楚些。
IRP会被排队的处理的。一次处理一个。 |
|
10楼#
发布于:2002-08-05 17:44
这会产生什么问题呢
|
|
|
11楼#
发布于:2002-08-05 17:44
多处理器冲突靠自旋锁来避免
|
|
|
12楼#
发布于:2002-08-05 17:57
恩:)
arthurtu的意思是系统会自己对irp进行排队处理吗?如果真如此,那么我们在访问硬件的底层驱动中,为什么还要自己对irp进行排队呢? 还有zydcat说的自旋锁,我觉得是用户设置的啊,难道驱动中的变量(包括局部和全局)都需要自旋锁来访问? |
|
13楼#
发布于:2002-08-05 20:07
driver中,一般不会有全局的变量的,因为driver是完全可重入的。局部的变量,在单独的线程中,不需要。
|
|
14楼#
发布于:2002-08-06 09:19
driver中怎么不会有全局变量,device extention就是典型,
|
|
|
15楼#
发布于:2002-08-06 10:34
呵呵
|
|
|
16楼#
发布于:2002-08-06 11:03
我没有算上device extension
|
|
17楼#
发布于:2002-08-07 00:36
没什么不能用的。
只要你保证。 访问时irql的级别 就可以了。 filemon里的mutex, hash, log都是全局的。 sfiler里的deveice object区分也是如此。 其他ds sample里也是一堆。当然,尽量少用确实是好的原则。 |
|
18楼#
发布于:2002-08-21 11:36
谢谢。是我把dll和sys在系统中的地址空间搞错了,
所以引发了很多理解上的错误。现在我已经很清楚了,谢谢 各位指点! ps:我现在怎么加不了分数呢?老是提示我还没登陆论坛, 但可以回复文章,新发表的文章又可以给分,不解...... [编辑 - 8/21/02 by daor] |
|
19楼#
发布于:2002-08-21 13:36
分只能给一次,要想再给,就要再开个帖子才行的。
|
|