daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3017回复:19

关于sys驱动和dll之间的区别

楼主#
更多 发布于:2002-08-05 16:08
    现在有两个应用程序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的区别。谢谢!

最新喜欢:

mapoflmapofl
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-05 16:51
你的说法好像有矛盾

appwr appmt sys这个组合中,appwr并没有对event作任何操作
只有appmt创建,sys设置而已,



[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-08-05 17:07
event是内部对象,你只要能得到他的handle,有足够的权限,就可以访问。
所以,就是appmt给event的handle给dev,dev来操作这个event。
appwt和这个event发生不正当的关系了吗? :D
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-05 17:09

而在第二种情况又让appwr去看event,
两种情况前提不成立
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-05 17:14
先问这个:
AppWr和AppMt启动并打开dev设备时,系统是不是把dev.sys分别映射到它们的进程空间中,然后这两个进程空间分别保存有dev中的数据的“副本”?就象进程对dll的加载一样?
这是最关键的地方。谢谢!
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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。
    
不知道我的理解对不对
可能有点幼稚。见笑了:)
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-05 17:25
应该不是这样的

[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-08-05 17:27
no
sys在2G上面的空间,不属于2G下面的app空间。不像dll。sys只有一份的。
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-05 17:37
再次感谢!
那么这样就产生了一个问题:
可以想象在双cpu这样一种最坏的情况
如果两个app同时对dev发出了一个相同的IRP,那么Dev中对这个IPR的处理例程会如何运行?如果没有“副本”一说,那么两个IRP岂不是在同一个内存区中跑动?该分发例程中的每一个局部变量岂不是要被访问甚至修改两次?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-08-05 17:43
建议看看waly oney的书。说的比较清楚些。
IRP会被排队的处理的。一次处理一个。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-05 17:44
这会产生什么问题呢
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-05 17:44
多处理器冲突靠自旋锁来避免
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-05 17:57
恩:)
    arthurtu的意思是系统会自己对irp进行排队处理吗?如果真如此,那么我们在访问硬件的底层驱动中,为什么还要自己对irp进行排队呢?
    还有zydcat说的自旋锁,我觉得是用户设置的啊,难道驱动中的变量(包括局部和全局)都需要自旋锁来访问?

    

arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-08-05 20:07
driver中,一般不会有全局的变量的,因为driver是完全可重入的。局部的变量,在单独的线程中,不需要。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-08-06 09:19
driver中怎么不会有全局变量,device extention就是典型,
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-08-06 10:34
呵呵
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2002-08-06 11:03
我没有算上device extension
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2002-08-07 00:36
没什么不能用的。
只要你保证。
访问时irql的级别
就可以了。

filemon里的mutex, hash, log都是全局的。
sfiler里的deveice object区分也是如此。

其他ds sample里也是一堆。当然,尽量少用确实是好的原则。


daor
驱动牛犊
驱动牛犊
  • 注册日期2001-05-16
  • 最后登录2018-04-15
  • 粉丝0
  • 关注0
  • 积分-25分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-08-21 11:36
谢谢。是我把dll和sys在系统中的地址空间搞错了,
所以引发了很多理解上的错误。现在我已经很清楚了,谢谢
各位指点!

ps:我现在怎么加不了分数呢?老是提示我还没登陆论坛,
但可以回复文章,新发表的文章又可以给分,不解......

[编辑 -  8/21/02 by  daor]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2002-08-21 13:36
分只能给一次,要想再给,就要再开个帖子才行的。
游客

返回顶部